RegEX не в скобках - PullRequest
       8

RegEX не в скобках

0 голосов
/ 01 июня 2018

Мне нужно разделить текст по трубе, которая не в скобках.Вот пример текста

I {need|want|{ask|prefer}} you to {help {Jason|Maria|Santa|{Lucia|Raul}'s father}|go to school} 

Я нашел это /\|(?![^{]*})/g здесь: регулярное выражение, извлекать строку НЕ между двумя скобками

теперь, когда я хочу разделить эточасть строки по трубе

help {Jason|Maria|Santa|{Lucia|Raul}'s father}|go to school 

она также выбирает трубы между Джейсоном, Марией, Сантой, потому что после них есть открывающая скобка.Как изменить регулярное выражение так, чтобы оно соответствовало только трубе, если ее нет в скобках.

тестовые строки:

help {Jason|Maria|Santa|{Lucia|Raul}'s father}|go to school

должно возвращать

help {Jason|Maria|Santa|{Lucia|Raul}'s father}
go to school

.

Jason|Maria|Santa|{Lucia|Raul}'s father

должен вернуть

Jason
Maria
Santa
{Lucia|Raul}'s father

1 Ответ

0 голосов
/ 01 июня 2018

Вы можете использовать SKIP-FAIL regex :

'~(\{(?:[^{}]++|(?1))*})(*SKIP)(*F)|\|~'

См. regex demo

Подробности

  • (\{(?:[^{}]++|(?1))*})(*SKIP)(*F) - сопоставить подстроку между сбалансированными фигурными скобками и пропустить это совпадение
    • (\{(?:[^{}]++|(?1))*}) - группа захватаПовторяется 1 совпадение {, затем 0+ повторений 1+ символов, отличных от { и } или всего шаблона группы 1 ((?1) - подпрограмма регулярного выражения), а затем } (сбалансированные фигурные скобки)подстрока)
    • (*SKIP)(*F) - глаголы PCRE, которые приводят к тому, что механизм регулярных выражений не выполняет сопоставление, и пропускают сопоставленный текст для продолжения сопоставления с конца совпадения
  • |- или
  • \| - сопоставить буквенный канал для разделения.

Демонстрация PHP :

$re = '~(\{(?:[^{}]++|(?1))*})(*SKIP)(*F)|\|~';
$str = "Jason|Maria|Santa|{Lucia|Raul}'s father";
print_r( preg_split($re, $str) );

Вывод:

Array
(
    [0] => Jason
    [1] => Maria
    [2] => Santa
    [3] => {Lucia|Raul}'s father
)
...