Подтвердить что ты не робот

Найти/заменить в 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]];

Как это сделать, используя одно регулярное выражение поиска/замены?

4b9b3361

Ответ 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 - Текстовый

  • Введите [myClass doOperation в Find

  • Нажмите увеличительный класс и выберите "Вставить рисунок"

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

  • Теперь будет работать однозадачное Replace All.

  • Подробнее о регулярных выражениях см. эту ссылку.

См. также

Ответ 4

Я не могу найти ничего, говоря, что регулярное выражение и замена поддерживаются WITHIN Xcode.

вам нужно

\[myClass\.myMethod\sdoOperation([A-Z][a-z]+)\] 

чтобы зафиксировать число. хоть. вот для чего скобки.

Ответ 5

В текущей версии Xcode я считаю, что вы можете искать только регулярные выражения. Заменить не дает вам такой гибкости. Если у вас есть только три метода, которые вы хотите заменить таким образом, я бы выполнил поиск и заменил три раза. В противном случае я бы изменил исходный код в BASH с помощью awk или sed.