Найти/заменить в Xcode с помощью регулярного выражения
У меня есть следующие вызовы функций в нескольких местах моего класса.
[myClass doOperationOne];
[myClass doOperationTwo];
[myClass doOperationThree];
В этих строках я хочу найти следующее,
[myClass doOperationOne
[myClass doOperationTwo
[myClass doOperationThree
И замените их следующим: (добавив WithOptions:[Permissions isOptionsAvailable]
)
[myClass doOperationOneWithOptions:[Permissions isOptionsAvailable]];
[myClass doOperationTwoWithOptions:[Permissions isOptionsAvailable]];
[myClass doOperationThreeWithOptions:[Permissions isOptionsAvailable]];
Как это сделать, используя одно регулярное выражение поиска/замены?
Ответы
Ответ 1
Как-то мне удалось найти ответ (которого достаточно для моей потребности здесь), отправив сообщение: http://www.cocoabuilder.com/archive/xcode/273123-how-to-use-regular-expressions-in-xcode-find-replace.html и метод проб и ошибок.
Моя строка Найти:
(\[myClass.myMethod )(.*)(\];)
И моя строка Replace:
\1\2WithOptions:[Permissions isOptionsAvailable]\3
Пожалуйста, напишите, если есть лучший способ, чем это.
Ответ 2
ПРИМЕЧАНИЕ. Поведение изменилось в Xcode 6. Синтаксис \123 был заменен на $123. Также будьте предупреждены, что новые строки теперь могут быть сопоставлены в reg exps, поэтому не забудьте обрезать перед Replace-Alling
Добавление дополнительного аргумента в метод:
Чтобы заменить
[* setFoo:*]
с
[* setFoo:* bar:value]
вы делаете
(setFoo:)(.*)(\])
$1$2 bar:value]
(строка поиска и строка замены соответственно).
или, если на Xcode 5 или старше
(setFoo:)(.*)(\])
\1\2 bar:value]
(ниже используется новый синтаксис: swap, если на Xcode 5 или старше)
ПРИМЕЧАНИЕ. Все написанное здесь применимо к методам замены строк в NSString
/NSMutableString
при использовании NSRegularExpressionSearch
!
Другими словами, эта строка:
[input replaceOccurrencesOfString:@"\n\\[([^\\]^\n]*)\\]\n"
withString:@"\n///\n\n[$1]\n"
options:NSRegularExpressionSearch
range:(NSRange){0,input.length}];
преобразует все "[...]\n"
последовательности (оставляя, например, только "[...\n..."
!) в "\n///\n\n[...]\n"
, сохраняя ...
, используя $1.
Всегда делал это вручную, но в этом случае я добавлял флаг OPIALAL 'animate:', и по умолчанию до этого момента было ДА, но я не хотел, чтобы каждый звонок должен был быть обновлен.
Другие примеры:
Устаревшие методы (iOS)
dismissModalViewControllerAnimated:...
обесценивание
Чтобы исправить устаревший dismissModalViewController
, заменив его пустым блоком завершения и сохранив анимированное значение:
(dismissModalViewControllerAnimated:)(.*)(\])
dismissViewControllerAnimated:$2 completion:nil]
presentModalViewController:animated:
обесценивание
(presentModalViewController:)(.*)( animated:)(.*)(\])
presentViewController:$2$3$4 completion:nil]
Разное
PD... Release → PD... Destroy
Недавно я написал библиотеку ac с кучей файлов с префиксом PD
, и я использовал Create/Release как malloc/free keywords, о чем я сожалел, так как это может заставить людей думать, что подсчет сохраняется, поэтому я хотел переименовать PD<anything>Release(
с помощью PD<anything>Destroy(
.
([\n\r ])(PD)(.*)Release\(
$1$2$3Destroy(
Так как Core Graphics имеет CGPDFDocumentRelease
и тому подобное, я должен был обеспечить, чтобы слово начиналось с PD.
<удаp > PDAssert(
удаp > PDScannerPop...(...)
)
удаp > ;
Я глупо положил утверждения вокруг функционального кода, который станет пустым, когда! #ifdef DEBUG. К счастью, я знал, что все это началось с PDAssert (PDScannerPop.... и закончилось);.
(PDAssert\()(PDScannerPop)(.*)(\);)
$2$3;
Нет $1, потому что это снова включило бы PDAssert(
. Обратите внимание, что я разделился сразу после PDAssert (и ухожу)); в третьем куске, который удаляет излишки parens из удаления PDAssert (.
Работа с конечными скобками
Вы можете сопоставить все, кроме ")", чтобы иметь дело с чрезмерно жадным регулярным выражением. Пример:
foo(replace(arg), bar)
foo(newvalue(newarg), bar)
Использование replace\((.*)\)
будет захватывать replace(arg), bar)
, и результат будет foo(newvalue(newarg)
! Вместо этого используйте replace\(([^\)]*)\)
, который захватит replace(arg)
и оставьте , bar)
самостоятельно.
Преобразование связки свойств NSString с помощью сохранения и/или сильного (и всего остального) на использование копии
@property \(([^\)]*)[sr][te][rt][oa][ni][gn]([^\)]*)\)(.*)NSString(.*)
@property ($1copy$2)$3NSString$4
Странная вещь в центре соответствует "сильному" и "удерживающему".
Ответ 3
Примечание для Xcode 8
Я пытался обновить свой ответ ниже для Xcode 8, но я не мог этого сделать. Если у вас есть ответ, сообщите мне.
Xcode 7
Если вы уже не были гениальным регулярным выражением, это гораздо проще сделать в Xcode. Вам вообще не нужно использовать регулярные выражения (но вы можете, если захотите).
Пример
Замените эти строки:
[myClass doOperation Один]
[myClass doOperation Два].
[myClass doOperation Три];
с этими строками
[myClass doOperation Один WithOptions: [Разрешения isOptionsAvailable]],
[myClass doOperation Два WithOptions: [Разрешения isOptionsAvailable]],
[myClass doOperation Три WithOptions: [Разрешения isOptionsAvailable]];
Полужирные цифры показывают, почему простой Find и Replace не будут работать.
Настройка
Существует два способа поиска и замены: Текстовое и Регулярное выражение
Нажмите увеличительное стекло
![enter image description here]()
и "Изменить параметры поиска..."
![enter image description here]()
и выберите один из них.
![enter image description here]()
Метод 1 - Текстовый
![enter image description here]()
- Выберите "Любые символы слов"
![enter image description here]()
![enter image description here]()
- Повторите для строки замены, но используйте
WithOptions:[Permissions isOptionsAvailable]];
для последней части.
![enter image description here]()
- Теперь будет работать однозадачное Replace All.
Метод 2 - регулярное выражение
-
Убедитесь, что регулярные выражения выбраны, как описано выше в разделе "Настройка".
-
Используйте (\[myClass doOperation)(.*)(\];)
для регулярного выражения
-
Используйте $1$2WithOptions:[Permissions isOptionsAvailable]$3
для строки замены. $1
, $2
и $3
заменяют круглые скобки в регулярном выражении.
![enter image description here]()
См. также
Ответ 4
Я не могу найти ничего, говоря, что регулярное выражение и замена поддерживаются WITHIN Xcode.
вам нужно
\[myClass\.myMethod\sdoOperation([A-Z][a-z]+)\]
чтобы зафиксировать число. хоть. вот для чего скобки.
Ответ 5
В текущей версии Xcode я считаю, что вы можете искать только регулярные выражения. Заменить не дает вам такой гибкости. Если у вас есть только три метода, которые вы хотите заменить таким образом, я бы выполнил поиск и заменил три раза. В противном случае я бы изменил исходный код в BASH с помощью awk или sed.