簡體   English   中英

REGEX PCRE用於嵌套文本匹配的遞歸表達式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM