Второе условие для исключающего или (XOR) в регулярном выражении

#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 \()-])