Объясните это регулярное выражение, пожалуйста

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

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

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

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

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

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

ИЗМЕНИТЬ

Вот фактический фрагмент, о котором идет речь:

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

person James P. Wright    schedule 16.12.2009    source источник


Ответы (4)


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

 /matchthis/replacewiththis/settings

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

Разбирать дальше...

  [[:alpha:]]+|( )

Это соответствует буквенно-цифровому символу (содержащемуся в параметре $0) или дополнительно пробелу (содержащемуся в соответствующем параметре $1).

  (?1::$0)

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

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

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

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

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

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

В остальной части выражения используются те же самые правила, что описаны выше, хотя некоторые обозначения в vi немного индивидуальны - см. эту справочную веб-страницу.

person Dan J    schedule 16.12.2009
comment
Будет ли этот синтаксис регулярного выражения работать вне TextMate? Я предполагаю, что когда я печатаю в TextMate, он работает только с символом, который я только что набрал. Как написать это регулярное выражение, чтобы применить его ко всему файлу? - person James P. Wright; 16.12.2009

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

RegexBuddy

Я использую его, чтобы помочь понять существующие регулярные выражения, создать свои собственные, проверить регулярные выражения на строки и т. д. Благодаря этому я стал лучше @ регулярные выражения. К вашему сведению, я работаю под Wine на Ubuntu.

person Chris    schedule 16.12.2009
comment
Интересная тактика: предлагать программу только для Windows в ответ на вопрос о программе только для Mac. ;) - person mipadi; 21.12.2009
comment
лол прикольно, я даже не подумал об этом. ;) Как я уже говорил, я работал под Ubuntu/Wine. Согласно regexbuddy.com/usercomm.html, он отлично работает в Parallels на OS-X. - person Chris; 19.08.2010

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

person Agent_9191    schedule 16.12.2009

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

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

/ //g

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

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

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

person Community    schedule 16.12.2009