2014-02-19 4 views
0

Я решал старый вопрос из стека, чтобы я мог улучшить свое знание регулярных выражений. Поскольку у меня есть базовые знания о регулярном выражении, большинство из них были легкими, но этот вопрос regex problem является жестким.Как работают регулярные выражения regex?

Он запрашивает регулярное выражение, который извлекает из такого рода строки ou=persons,ou=(.*),dc=company,dc=org последней строкой непосредственно перед запятой не следует (.*). В последнем случае это должно дать dc=company,dc=org.

Решение (?<=,(?!.*\Q(.*)\E)).*, но я не могу понять его поток. Я понял (?!.*\Q(.*)\E) часть, но другие до сих пор остаются загадкой для меня. Специально ?<=, который является позитивным взглядом. Выполняет ли поиск с конца строки? Может кто-нибудь объяснить это мне, как будто я 7-летний ребенок - и, пожалуйста, http://regex101.com/ не помогает.

ответ

0

С помощью функции lookbehind вы можете указать контекст непосредственно перед фактическим совпадением.

Вы можете сказать, ,(dc=) и возвращать только группу захвата, или ,\Kdc= или (?<=,)dc= вернуть матч на dc=, но требуют, чтобы запятая присутствует только перед матчем.

Средство также позволяет несколько просмотра назад, так что вы могли бы сделать, чтобы соответствовать (?<=a.*)(?<=b.*)cc только если ей предшествует как a и b где-то на входе.

Lookbehind - в основном синтаксический сахар, в котором вы обычно можете перефразировать свои условия, используя какую-либо другую конструкцию регулярных выражений. Это может быть очень удобно, если у вас есть несколько unanchored ограничений, как в последнем примере

2

В RegEx (?<=,(?!.*\Q(.*)\E)).* взгляд-за зельем работает так:

  1. Начало в начале строки на первый символ ,
  2. Можно ли совместить то, что мы ищем?,(?!.*\Q(.*)\E)
    • Если мы не можем: Перемещение на один символ вперед, Перейти к 2. и проверить матч снова.
    • Если матч не найден: Запишите все оставшиеся символы, пока мы не сможем найти .* (или вообще попробуем сопоставить оставшийся RegEx).

Для более мирских объяснений рассмотреть чтение Lookahead and Lookbehind Zero-Length Assertions.

+0

Спасибо за объяснение. Можно ли это решить с помощью lookahead ?? – ntstha

+0

Это лучше всего задать в другом вопросе stackoverflow. –

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