2009-12-16 5 views
1

Регулярные выражения - полная пустота для меня. Я имею дело с одним прямо сейчас в TextMate, который делает то, что я хочу, чтобы он делал ... но я не знаю, ПОЧЕМУ он делает то, что я хочу, чтобы он делал.Объясните это Регулярное выражение пожалуйста

/[[:alpha:]]+|()/(?1::$0)/g 

Это используется в фрагменте TextMate и то, что она делает это принимает метку и выводит его в качестве имени идентификатора. Поэтому, если я набираю «First Name» в первом месте, это выводит «FirstName». Раньше это выглядело так:

/[[:alpha:]]+|()/(?1:_:/L$0)/g (it might have been \L instead) 

Это превратит «Имя» в «first_name». Итак, я понимаю, что подчеркивание добавляет символ подчеркивания для пробела и что/L уменьшает все ... но я не могу понять, что все это делает или почему.

Кто-то должен объяснить это по частям?

EDIT

Вот фактический сниппет в вопросе:

<column header="$1"><xmod:field name="${2:${1/[[:alpha:]]+|()/(?1::$0)/g}}"/></column> 

ответ

6

Это регулярное выражение в формате (регулярное выражение) в основном:

/matchthis/replacewiththis/settings 

«Г» установка в конце означает сделать глобальную замену, а не просто ограничивать регулярное выражение для конкретной линии или выбора.

разбив его дальше ...

[[:alpha:]]+|() 

, который соответствует буквенно-цифровой символ (удерживаемого в параметре $0) или необязательно пространство (удерживаемого в соответствие параметр $1).

(?1::$0) 

Как говорит Роджер, то ? указывает эта часть является условным.Если совпадение было найдено в параметре $1, то оно заменяется материалом между двоеточиями :: - в этом случае ничего. Если ничего нет в $1, то совпадение заменяется содержимым $0, то есть любой буквенно-цифровой символ, который не является пространством, выводится без изменений.

Это объясняет, почему в первом примере пробелы удаляются, а в втором примере пробелы заменяются символами подчеркивания.

Во втором выражении \L используется для ввода текста в нижний регистр.

Дополнительный вопрос в комментарии: как запустить это выражение вне TextMate. Использование vi в качестве примера, я хотел бы разбить его на несколько этапов:

:0,$s/ //g 
:0,$s/\u/\L\0/g 

Первая часть вышеупомянутых команд говорит VI запустить s ubstitution, начиная с линии 0 и заканчивается в конце файла (это то, что $ означает).

Остальная часть выражения использует те же правила, которые описаны выше, хотя некоторые из обозначений в vi немного обычны - see this reference webpage.

+0

Будет ли этот синтаксис регулярного выражения работать вне TextMate? Я предполагаю, что при вводе текста в TextMate он работает только с символом, который я только что напечатал. Как записать это регулярное выражение, чтобы применить его к целому файлу? –

+0

См. Обновленный ответ выше для примера вне TextMate. –

1

он ищет какой-либо альфа-символ, который появляется по крайней мере один раз в строке [[:alpha:]]+ или пространстве ().

1
/[[:alpha:]]+|()/(?1::$0)/g 

(?1 является условным и используется, чтобы лишить матч, если группа 1 (один пробел) был подобран, или заменить матч с $0, если группа 1 не совпадают. Поскольку $0 - это весь матч, он заменяется на себя в этом случае. Это регулярное выражение совпадает с:

/ //g 

I.e. удалите все пробелы.

/[[:alpha:]]+|()/(?1:_:/\L$0)/g 

Это регулярное выражение до сих пор используют те же условия, за исключением теперь, если группа 1 была подобрана, она заменяется символом подчеркивания, а в противном случае используется полный матч ($0), модифицированный \L. \L изменяет случай всего текста, который приходит после него, поэтому \LABC приведет к abc; подумайте об этом как о специальном контрольном коде.

2

Я нашел RegexBuddy хороший инструмент для работы с регулярными выражениями. Я вставил свое 1-регулярное выражение, чтобы Бадди, и я получил объяснение, показанное в нижней части рамы:

RegexBuddy http://img189.imageshack.us/img189/9476/screenshotregexbuddy.png

Я использую его для содействия понимания существующих regexs, строительство самостоятельно, тестирования regexs против строк и т.д. I Из-за этого вы стали лучше @ regexs. FYI Я бегу под Wine on Ubuntu.

+0

Интересная тактика, предлагающая программу только для Windows в ответ на вопрос о программе только для Mac. ;) – mipadi

+0

lol nice, я даже не думал об этом. ;) Как я уже говорил, я бегал под Ubuntu/Wine. Per http://www.regexbuddy.com/usercomm.html «он отлично работает в Parallels на OS-X». – Chris

Смежные вопросы