Прямо сейчас я использую ниже регулярное выражение, чтобы пропустить все, что между {% ... %}
(\\|\.|\*|\/|\-|\)|\+|\$|\||\[|\]|\(|\^|\?|\!|\~|\`)(?![^{%]*?%})
Однако иногда это не работает должным образом, потому что, когда у меня есть текст:
"This is test. ! {%.?{1}.%} . and it doesn't work"
Это ломается, и это также соответствует точкам в {% %}
область, которую я не хочу. {
а также }
ломает это.
Негативный Lookahead должен искать {%
строка, а не один символ {
или же }
,
Все что находится между {% ... %}
должны быть пропущены
Любая идея?
Просматривая ваше регулярное выражение, я увидел, что вы допустили некоторые ошибки, на которые я укажу.
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- Это не гарантирует правильных совпадений для вложенных или несбалансированных разделителей.
Окончательное решение (Живая демо):
([\/.*)($.+|^?!`\[\]-])(?!(?:(?!{%).)*?%})
Других решений пока нет …