Regex для захвата & lt; не является частью блока \ (… \)

Я хотел бы написать регулярное выражение, способное захватить первый < символ, который не является частью блока, начинающегося с \( и заканчивая \),

Некоторые примеры:

  1. foo1<foo2<fooooo3 должен вернуть первый < персонаж.
  2. \( gzgajk < lmklklml < \) foo1 < foo2 должен вернуть третий < персонаж.
  3. \( sss < ljlj\) foo1 \(sqdzadz <jiojuioio\) foo2 < foo3 должен также вернуть третий < персонаж.

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

Любая подсказка по теме?

1

Решение

Вы можете соответствовать \( и его пара \) и все что между <s) затем игнорировать их (*SKIP)(*FAIL)затем сопоставьте любой < и теперь вы не в сгруппированной паре. например

\\\(.*?\\\)(*SKIP)(*FAIL)|<

Вы можете прочитать больше об этом здесь, http://rexegg.com/regex-best-trick.html.

Демо-версия: https://regex101.com/r/mQee39/1

3

Другие решения

Не знаю, чего вы хотите достичь здесь, но посмотрите на это:

$subject ='\( sss < ljlj\) foo1 \(sqdzadz <jiojuioio\) foo2 < foo3';
preg_match ('#([<]{1})#', $subject , $matches, 0, (int)strrpos($subject,')'));
print_r($matches);
  • strrpos () получает позицию последнего ), если ничего не найдено, начинается с позиции 0
  • preg_match () будет знать взгляд из этой позиции на следующий <,
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector