#regex
#регулярное выражение
Вопрос:
Я хотел бы получить некоторую помощь со вторым условием для XOR в этом регулярном выражении, над которым я работаю.
Это регулярное выражение предназначено для получения строки, которая находится после cn=
и продолжается до тех пор, пока за круглой скобкой не последует пустое место, или продолжается до двух закрывающих круглых скобок.
В первом случае это будет текст после пустого места, которого я бы хотел, чтобы его не было в моих данных соответствия, но я не могу избавиться от этого, например:
(amp;(cn=Another (test)))
(amp;(cn=Another (test)) (objectClass=group))
В этом примере выше я хотел бы получить только другой (тест)
Я попробовал отрицательный прогноз, но, похоже, это не сработало.
Что я получил до сих пор:
https://rubular.com/r/DVV830IGSGiNSf
Редактировать:
Что мне нужно получить, так это строку, которая находится внутри той же круглой скобки, что и cn=
текст, за исключением cn=
самого. Мне нужно то, что выделено:
(amp;(cn=Тестирование))
(amp;(cn=Тестирование) (класс объекта=группа))
(amp;(CN=Te(st)ing))
(amp;(CN=Te(st)ing) (класс объекта=группа))
(amp;(cn=Другой (тестовый)))
(amp;(cn=Другой (тестовый)) (класс объекта=группа))
(amp;(cn=Доступ к RW Srv-corpSCRIPTSSDESENV))
(amp;(cn=Доступ к RW Srv-corpscriptssdesenv) (класс объекта=группа))
(amp;(cn=Acess( )))
(amp;(cn=Acess( )) (класс объекта=группа))
Комментарии:
1. То, что вы просите,
cn=K[^)]*)(?=[ )])
но это соответствует большему количеству, чем вы хотите, заданной входной строке в rubular. Поэтому, пожалуйста, уточните свои требования.2. @revo Отредактировано, спасибо
Ответ №1:
К счастью, Ruby 2.* поддерживает рекурсии, от которых зависят ваши требования. Используйте следующее регулярное выражение:
(?i)cn=K((g<1>)|[^()]*)
Смотрите живую демонстрацию здесь
Разбивка регулярного выражения:
(?i)
Включить совпадение без учета регистраcn=
Совпадениеcn=
K
Сбросить вывод(
Начало захвата группы # 1(g<1>)
Рекурсивное совпадение, при котором видна открывающая скобка|
Или[^()]*
Сопоставьте что-либо, кроме(
и)
)
Конец CP # 1, повторяйте как можно больше
Комментарии:
1. Действительно, очень ценю ваше решение, но, к сожалению, я использую ruby 1.9.3 (да, я знаю) : (
2. Тогда вы могли бы использовать это
(?i)cn=K(?:([^()]*)|[^()]*)
, если вы уверены, что круглые скобки не будут вставляться.3. Это второе решение также работает только на ruby > = 2.0.0 🙁
4. Извините, удалите
K
и используйте группы захвата:(?i)cn=((?:([^()]*)|[^()]*) )
Ответ №2:
Я бы предложил разделить строку на соответствующие круглые скобки cn
, а затем использовать (cn|CN)=([0-9a-zA-Z \()-])