Прямо сейчас я использую ниже регулярное выражение, чтобы пропустить все, что находится между {%... %}
(\\|\.|\*|\/|\-|\)|\+|\$|\||\[|\]|\(|\^|\?|\!|\~|\')(?![^{%]*?%})
Однако это не работает должным образом, потому что, когда у меня есть текст:
"This is test. ! {%.?{1}.%} . and it doesn't work"
Он ломается, и он также совпадает с точками в области {% %}
которые я не хочу. {
и }
нарушает его. Отрицательный Lookahead должен искать {%
string, а не одиночный символ {
или }
.
Все, что находится между {%... %}
должны быть пропущены.
Есть идеи?
Посмотрев через ваше регулярное выражение, я увидел, что вы допустили некоторые ошибки, которые я собираюсь указать.
1- (?![^{%]*?%})
Простыми словами не означает все, кроме между {%..%}. Вы использовали набор символов [^{%]
что означает {
OR %
и не {%
все вместе. Итак, что он говорит: один из тех предыдущих символов, которые не являются ( за ними следуют ноль или более символов, кроме {
OR %
и заканчивается до %}
)
Другими словами, вы можете написать его как (?!%})
, Поэтому специальные символы совпадают, кроме этого .
до %}
:
"This is test. ! {%.?{1}.%} . and it doesn't work"
^
2- Таким образом, вы не должны проверять только {
или %
но оба вместе. Однако, поскольку я вижу ваше регулярное выражение, вы можете проверить только %
: (?![^%]*?%})
. Но это не удастся, если в вашей строке ввода есть что-то вроде ниже:
"This is test.%} ! {%.%?{1}.%} . and it doesn't work"
^
dot
фиксируется.
3- Хорошее решение - это закаленная точка, которую я использовал в качестве названия на rexegg.com: (?!(?:(?!{%).)*?%})
Это (?:(?!{%).)*?
является заменой [^{%]
а внутри - отрицательным взглядом, который утверждает, что то, что следует за текущей позицией, не является строкой {%
.
4- Мне не нравится (\\|\.|\*|\/|\-|\)|\+|\$|\||\[|\]|\(|\^|\?|\!|\~)
и должны заменить его на нечто более читаемое и более простое: ([\/.*)($.+|^?!\[\]-])
5- Он не гарантирует правильные совпадения для вложенных или несбалансированных разделителей.
Окончательное решение (Live demo):
([\/.*)($.+|^?!'\[\]-])(?!(?:(?!{%).)*?%})