Как правильно сопоставить регулярные выражения?

StackOverflow https://stackoverflow.com/questions/480717

  •  20-08-2019
  •  | 
  •  

Вопрос

У меня есть список объектов, выводимых из 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 для сопоставления шаблонов и передачи вывода другим утилитам командной строки.

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

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

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

Проверить Экспрессо Раньше я использовал его для создания своего RegEx.Хорошо также помогать в обучении.

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

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

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

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

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

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

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

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

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

HPOTTER
HGRANGER
RWEASLEY
DMALFOY
SSNAPE
ADUMBLED

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top