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

0

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

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

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

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

Он ломается, и он также совпадает с точками в области {% %} которые я не хочу. { и } нарушает его. Отрицательный Lookahead должен искать {% string, а не одиночный символ { или }.

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

Есть идеи?

Теги:
pcre

1 ответ

0

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

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):

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню