Regex, извлечь строку NOT между двумя скобками

OK вопрос с регулярным выражением, как извлечь символ НЕ между двумя символами, в этом случае скобки.

У меня есть строка, такая как: word1 | {word2 | word3} | слово 4

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

В основном я использую это регулярное выражение в функции разделения JavaScript, чтобы разбить это на массив, содержащий: "word1", "{word2 | word3}", "word4".

Любая помощь будет принята с благодарностью!

Ответ 1

В refiddle.com установлен JavaScript, попробуйте использовать этот шаблон

/\|(?![^{]*})/g

с этим текстом

word1 | {word2 | word3 } | word 4 | word 4 | {word2 | word3 }

Это должно соответствовать всем символам трубы, которые не находятся внутри {}.

Ответ 2

В зависимости от языка/реализации, которую вы используете, но...

\|(?![^{]*})

Это соответствует каналу, за которым не следует }, за исключением случая, когда на первом месте находится {.


(?! ... ) известен как отрицательное утверждение. Это легче понять, если мы начнем с положительного утверждения:

\|(?=[^{]*})

Вышеуказанный только соответствует трубе, за которой следует }, не встречая сначала {. Когда вы отрицаете это, заменив = на !, совпадение теперь будет только успешным, если нет пути для положительного случая быть истинным (также называемым дополнением).