Regex для всего, кроме токена с несколькими символами

Я хочу создать регулярное выражение, которое возвращает все между двумя токенами с несколькими символами, где открывающий токен ;;( и закрывающий токен ;;), такие как

;;(
  Capture this part, which can contain everything except the closing token 
;;)

Я думал, что регулярное выражение /;;\((?!;;\));;\)/ использование отрицательного прогнозирования должно работать, но это не возвращает совпадений. Можно ли использовать для этого регулярное выражение?

2 ответа

Решение

Используйте позитивный взгляд назад и позитивный взгляд вперед.

(?<=;;\().*?(?=;;\))

Демо: https://regex101.com/r/iK5wG4/2

Чтобы сопоставить некоторый текст между двумя разделителями из нескольких символов, используется регулярное выражение, соответствующее методу unroll-the-loop.

Итак, мы имеем ;;( а также ;;) разделители.

Регулярное выражение соответствия ленивых точек ;;\((.*?);;\), Этот шаблон неэффективен, так как он будет становиться все медленнее и медленнее, когда все больший и больший текст входит в качестве входных данных.

Разматывая это как ;;\(([^;]*(?:;(?!;\))[^;]*)*);;\) делает соответствие линейным и единственная проблема может возникнуть со скоростью, если есть много ; внутри блока.

Требуется решение Тимгеба 169 шагов, чтобы завершить матч. На это у меня уходит всего 16 шагов.

Кроме того, развернутое регулярное выражение не зависит от /s Модификатор DOTALL, его можно опустить.

Почему бы не использовать lookarounds? Локарды хороши, когда вам нужны совпадающие совпадения или если есть определенные условия. В этом случае вам нужны неперекрывающиеся совпадения, потому что начальный и конечный разделители не равны. Используйте группы захвата, пары неэкранированных скобок вокруг тех подшаблонов, которые вам нужны. В ;;\(([^;]*(?:;(?!;\))[^;]*)*);;\) нам нужно получить весь текст, который не ;;) то есть это [^;]*(?:;(?!;\))[^;]*)* часть. Таким образом, мы заключаем это с (),

Что соответствует этой развернутой части?

  • [^;]* - все, кроме ; (первый символ конечного разделителя)
  • (?:;(?!;\))[^;]*)* - ноль или более последовательностей...
    • ;(?!;\)) - первый символ конечного разделителя, литерал ; это не сопровождается ;) (остальная часть конечного разделителя)
    • [^;]* - ноль или более символов, кроме ; (первый символ конечного разделителя)
Другие вопросы по тегам