Как правильно сопоставить регулярные выражения? - PullRequest
8 голосов
/ 26 января 2009

У меня есть список объектов, выводимых из ldapsearch следующим образом:

dn: cn=HPOTTER,ou=STUDENTS,ou=HOGWARTS,o=SCHOOL
dn: cn=HGRANGER,ou=STUDENTS,ou=HOGWARTS,o=SCHOOL
dn: cn=RWEASLEY,ou=STUDENTS,ou=HOGWARTS,o=SCHOOL
dn: cn=DMALFOY,ou=STUDENTS,ou=HOGWARTS,o=SCHOOL
dn: cn=SSNAPE,ou=FACULTY,ou=HOGWARTS,o=SCHOOL
dn: cn=ADUMBLED,ou=FACULTY,ou=HOGWARTS,o=SCHOOL

Пока у меня есть следующее регулярное выражение:

/\bcn=\w*,/g

, который возвращает результаты, подобные этому:

cn=HPOTTER,
cn=HGRANGER,
cn=RWEASLEY,
cn=DMALFOY,
cn=SSNAPE,
cn=ADUMBLED,

Мне нужно регулярное выражение, которое возвращает такие результаты:

HPOTTER
HGRANGER
RWEASLEY
DMALFOY
SSNAPE
ADUMBLED

Что мне нужно изменить в своем регулярном выражении, чтобы шаблон (cn= и запятая) не был включен в результаты?

РЕДАКТИРОВАТЬ: Я буду использовать sed для сопоставления с шаблоном и передачи результатов в другие утилиты командной строки.

Ответы [ 7 ]

13 голосов
/ 26 января 2009

Вам нужно будет выполнить группировку. Это делается путем изменения регулярного выражения:

/\bcn=\(\w*\),/g

После этого ваш результат будет преобразован в переменную группировки. В зависимости от вашего языка, как извлечь это значение будет отличаться. (Для вас с sed переменная будет \ 1)

Обратите внимание, что большинству разновидностей регулярных выражений не нужно выходить за скобки (), но, поскольку вы используете sed , вам потребуется, как показано выше.

Для отличного ресурса по регулярным выражениям я предлагаю: Освоение регулярных выражений

4 голосов
/ 26 января 2009

ОК, место, где вы задали более конкретный вопрос, было закрыто как «точная копия» этого, поэтому я копирую свой ответ оттуда сюда:

Если вы хотите использовать sed, вы можете использовать что-то вроде следующего:

sed -e 's/dn: cn=\([^,]*\),.*$/\1/'

Вы должны использовать [^,]*, потому что в sed .* означает "жадный", что означает, что он будет соответствовать всему, что может, прежде чем смотреть на любой следующий символ. Это означает, что если вы используете \(.*\), в своем шаблоне, он будет соответствовать до последней запятой, а не до первой запятой.

2 голосов
/ 26 января 2009

Если ваше регулярное выражение поддерживает Lookaheads и Lookbehinds, тогда вы можете использовать

/(?<=\bcn=)\w*(?=,)/g

Это будет соответствовать

HPOTTER
HGRANGER
RWEASLEY
DMALFOY
SSNAPE
ADUMBLED

Но не cn= или , с обеих сторон. Запятая и cn= все еще должны быть там для матча, они просто не включены в результат.

2 голосов
/ 26 января 2009

Не зная, какой язык вы используете, мы не можем сказать точно, но в большинстве парсеров регулярных выражений, если вы используете круглые скобки, такие как

/ \ барселона = (\ W *), / г

тогда вы сможете получить первый соответствующий шаблон (часто \ 1) как именно то, что вы ищете. Чтобы быть более конкретным, нам нужно знать, какой язык вы используете.

2 голосов
/ 26 января 2009

Быстрый и грязный метод состоит в том, чтобы использовать подсправки, если ваш движок его поддерживает:

/\bcn=(\w*),/g

Тогда вы захотите получить первое совпадение.

2 голосов
/ 26 января 2009

Проверьте Expresso Я использовал его в прошлом, чтобы построить мой RegEx. Также полезно помогать учиться.

0 голосов
/ 26 января 2009

Звучит скорее как простая задача анализа, а не регулярное выражение. Грамматика ANTLR могла бы разобраться в этом в кратчайшие сроки.

...