Объясните это регулярное выражение, пожалуйста - PullRequest
1 голос
/ 16 декабря 2009

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

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

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

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

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

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

EDIT

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

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

Ответы [ 5 ]

6 голосов
/ 16 декабря 2009

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

 /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 немного нестандартные - см. Эту справочную веб-страницу .

2 голосов
/ 16 декабря 2009

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

RegexBuddy

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

1 голос
/ 16 декабря 2009

Это довольно подробный ресурс для регулярных выражений в TextMate . Приветствия.

1 голос
/ 16 декабря 2009
/[[:alpha:]]+|( )/(?1::$0)/g

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

/ //g

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

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

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

1 голос
/ 16 декабря 2009

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

...