Regex для всего, кроме токена с несколькими символами
Я хочу создать регулярное выражение, которое возвращает все между двумя токенами с несколькими символами, где открывающий токен ;;(
и закрывающий токен ;;)
, такие как
;;(
Capture this part, which can contain everything except the closing token
;;)
Я думал, что регулярное выражение /;;\((?!;;\));;\)/
использование отрицательного прогнозирования должно работать, но это не возвращает совпадений. Можно ли использовать для этого регулярное выражение?
2 ответа
Используйте позитивный взгляд назад и позитивный взгляд вперед.
(?<=;;\().*?(?=;;\))
Чтобы сопоставить некоторый текст между двумя разделителями из нескольких символов, используется регулярное выражение, соответствующее методу unroll-the-loop.
Итак, мы имеем ;;(
а также ;;)
разделители.
Регулярное выражение соответствия ленивых точек ;;\((.*?);;\)
, Этот шаблон неэффективен, так как он будет становиться все медленнее и медленнее, когда все больший и больший текст входит в качестве входных данных.
Разматывая это как ;;\(([^;]*(?:;(?!;\))[^;]*)*);;\)
делает соответствие линейным и единственная проблема может возникнуть со скоростью, если есть много ;
внутри блока.
Требуется решение Тимгеба 169 шагов, чтобы завершить матч. На это у меня уходит всего 16 шагов.
Кроме того, развернутое регулярное выражение не зависит от /s
Модификатор DOTALL, его можно опустить.
Почему бы не использовать lookarounds? Локарды хороши, когда вам нужны совпадающие совпадения или если есть определенные условия. В этом случае вам нужны неперекрывающиеся совпадения, потому что начальный и конечный разделители не равны. Используйте группы захвата, пары неэкранированных скобок вокруг тех подшаблонов, которые вам нужны. В ;;\(([^;]*(?:;(?!;\))[^;]*)*);;\)
нам нужно получить весь текст, который не ;;)
то есть это [^;]*(?:;(?!;\))[^;]*)*
часть. Таким образом, мы заключаем это с ()
,
Что соответствует этой развернутой части?
[^;]*
- все, кроме;
(первый символ конечного разделителя)(?:;(?!;\))[^;]*)*
- ноль или более последовательностей...;(?!;\))
- первый символ конечного разделителя, литерал;
это не сопровождается;)
(остальная часть конечного разделителя)[^;]*
- ноль или более символов, кроме;
(первый символ конечного разделителя)