[英]REGEX PCRE Recursive expression for nested text matching
所以我正在嘗試做這樣的事情(是的,包括換行符):
第一場比賽
START
START
stuff
STOP
more stuff
STOP
比賽#2
START
START
stuff
STOP
more stuff
STOP
這就是我走了多遠
START(.*?^(?:(?!STOP).)*$|(?R))|STOP
,參數為“ g”,“ m”,“ i”和“ s”
問題是在STOP
匹配整個文本中的最后一個“ STOP”之后,我無法匹配任何內容。
這是一個regex101示例
https://regex101.com/r/vD4nX6/1
我會請一些指導
提前致謝
這是與您的示例匹配的模式:
^\h*START\h*\n(?:\h*+(?!(?:START|STOP)\h*$)[^\n]*\n|(?R)\n)*\h*STOP\h*$
使用/mg
標志(位於https://regex101.com/r/iK9tK5/1 )。
其背后的想法是:
^ # beginning of line
\h* START \h* \n # "START" optionally surrounded by horizontal whitespace
# on a line of its own
(?: # between START/STOP, every line is either "normal"
# or a recursive START/STOP block
\h*+ # a normal line starts with optional horizontal whitespace
(?! # ... not followed by ...
(?: START | STOP ) \h* $ # "START" or "STOP" on their own
)
[^\n]* \n # any characters, then a newline
|
(?R) \n # otherwise it's a recursive START/STOP block
)* # we can have as many items as we want between START/STOP
\h* STOP \h* # "STOP" optionally surrounded by horizontal whitespace
$ # end of line
為了避免通過\\h*
的0次迭代意外匹配" STOP"
,而不是"STOP"
(它們后面是" STOP"
(帶空格)),我已將\\h*+
變為所有格。 +
強制\\h
盡可能匹配多次,因此必須占用空間。
或者,您可以將\\h*
拉到前瞻中: (?!\\h*(?:START|STOP)\\h*$)
那也可以,但是先行搜索將跳過任何空格以查看是否跟隨着START / STOP,只是讓[^\\n]*
外面的空格再次經過這些空格。 開頭為\\h*+
,我們將這些空格匹配一次,並且不會回溯。 我猜這是微觀優化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.