Regex Lookahead проблема и улучшение

Прямо сейчас я использую ниже регулярное выражение, чтобы пропустить все, что между {% ... %}

(\\|\.|\*|\/|\-|\)|\+|\$|\||\[|\]|\(|\^|\?|\!|\~|\`)(?![^{%]*?%})

Однако иногда это не работает должным образом, потому что, когда у меня есть текст:

"This is test. ! {%.?{1}.%} .  and it doesn't work"

Это ломается, и это также соответствует точкам в {% %} область, которую я не хочу. { а также } ломает это.
Негативный Lookahead должен искать {% строка, а не один символ { или же },

Все что находится между {% ... %} должны быть пропущены

Любая идея?

0

Решение

Просматривая ваше регулярное выражение, я увидел, что вы допустили некоторые ошибки, на которые я укажу.

1- (?![^{%]*?%}) простыми словами не значит все, кроме {% ..%}.
Вы использовали набор символов [^{%] что значит { ИЛИ ЖЕ % и не {% все вместе. Так что он говорит: один из тех предыдущих персонажей, который не ( за которым следует ноль или более символов, кроме { ИЛИ ЖЕ % и заканчивается %} )

Другими словами, вы можете написать это как (?!%})Вот почему эти специальные символы совпадают, за исключением того, что . до %}:

"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- Это не гарантирует правильных совпадений для вложенных или несбалансированных разделителей.

Окончательное решение (Живая демо):

([\/.*)($.+|^?!`\[\]-])(?!(?:(?!{%).)*?%})
0

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

Других решений пока нет …

По вопросам рекламы [email protected]