регулярное выражение для имени с заглавными буквами в Xcode - PullRequest
1 голос
/ 04 февраля 2011

Я пытаюсь изменить все имена, которые выглядят следующим образом: thisForExample и изменить его на: this_for_example в Xcode с регулярным выражением. Кто-нибудь знает, как это сделать?

Я пытался с этим: ([a-z][A-Z])*[a-z]? но ничего не находит.

Ответы [ 3 ]

1 голос
/ 04 февраля 2011

Вам просто нужно найти [a-z][A-Z][a-z].

Однако автоматизировать процесс замены будет непросто - как вы планируете изменить произвольную заглавную букву на ее эквивалент в нижнем регистре?

0 голосов
/ 04 февраля 2011

Perl будет хорошим инструментом для этого (если вы настаиваете на использовании Regex), так как он поддерживает изменение регистра в шаблонах подстановки:

  • \l => изменить первый символ (следующей переменной соответствия) на нижний регистр
  • \L => изменить все символы (следующей переменной соответствия) на нижний регистр
  • \u => изменить одиночный символ (из следующей переменной соответствия) в верхний регистр
  • \U => изменить все символы (из следующей переменной соответствия) в верхний регистр

Если все, что вам нужно, это преобразовать (просто / тривиально!) Переменные и имена методов а-ля thisForExample в this_for_example.
Для этого достаточно одного регулярного выражения:

echo 'thisForExample = orThisForExample();' \
| perl -pe 's/(?<=[^A-Z])([A-Z]+)(?=[^A-Z])/_\L\1/g;'
//output: "this_for_example = or_this_for_example();"

Как только вы ожидаете встретить (довольно распространенные) имена, такие как ...

fooURL = URLString + URL + someURLFunction();

... у тебя проблемы. Глубокая проблема .

Посмотрим, что с этим делает наше выражение:

echo 'fooURL = URLString + URL + someURLFunction();' \
| perl -pe 's/(?<=[^A-Z])([A-Z]+)(?=[^A-Z])/_\L\1/g;'
//output: "foo_url = _urlstring + _url + some_urlfunction();"

Довольно плохо, а?

И еще хуже:
синтаксически невозможно различить между (довольно распространенным) именем переменной"URLString" и именем класса"NSString".

Заключение : Регулярное выражение само по себе довольно взлома и подвержено ошибкам для такого рода задач. И просто недостаточно . И вы не хотите, чтобы один вызов оболочки мог потенциально испортить всю вашу кодовую базу , не так ли?
Существует причина, по которой в XCode есть инструмент рефакторинга , который использует грамматическое дерево clang, чтобы различать синтаксически идентичные (по шаблону как минимум) имена переменных и классов. Это проблема для контекстно-свободных языков , а не обычных языков . Следовательно, регулярные выражения не могут справиться с этим . Вам понадобится грамматика без контекста для создания языкового дерева и т. Д. (И в то время вы только начали создавать компилятор )

Также: зачем использовать under_scores в любом случае? Если вы используете XCode, то вы, вероятно, в любом случае пишете код в ObjC (++) или аналогичном, где здравый смысл использовать camelCase. Я и, вероятно, в значительной степени все иначе возненавидят вас за то, что вы однажды заключили с нами ваш подчеркнутый код ObjC / C /….


Альтернативный ответ:

В комментарии к Paul R вы сказали, что в основном объединяете два проекта, один с именами с заниженной оценкой, другой с именами в формате camelCase .
Тогда я бы посоветовал вам переключить вашу базу кода under_scored на camelCase . По двум причинам:

  1. Превращение имен under_scored в camelCased гораздо менее подвержено ошибкам, чем наоборот. (То есть: конечно, только в среде, где доминирует camelCase! Было бы так же подвержено ошибкам, если бы вы в основном имели дело с кодом under_scored в XCode. Думайте об этом как о «просто меньшем количестве кода, который потенциально может сломаться»;)) 1101 *

  2. Цитирую свой ответ:

[…] Я и, вероятно, в значительной степени все иначе будут вас ненавидеть за то, что вы однажды заключили сделку с вашим Код ObjC / C /… подчеркнут. [...]

Вот простое регулярное выражение для преобразования under_score в camelCase:

echo 'this_for_example = _leading_under_score + or_this_for_example();' \
| perl -pe 's/(?<=[\w])_([\w])/\u\1/g;'
//output: "thisForExample = _leadingUnderScore + orThisForExample();"
0 голосов
/ 04 февраля 2011

Что-то вроде ([a-zA-Z][a-z]+)+?

Процесс может выглядеть следующим образом: вы получаете все имена в файл, там вы автоматически подделываете замену и создаете (автоматически) сценарий sed для замены одного на другое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...