我正在尋找與關鍵字 .if .else .elseif 和 .endif 之間的文本匹配的正則運算式
例子:
.if CONDITION1
code1
.elseif CONDITION2
code2
.else
code3
.endif
理想情況下,正則運算式只匹配 code1、code2 和 code3,但如果它也匹配關鍵字后面的文本(CONDITION1、CONDITION2...)也可以。
我嘗試了以下正則運算式:
(?:\.if|\.else)(.*?)(?:\.else|\.endif)
但它錯過了代碼2
演示
當沒有 .elseif 和/或 .else 時,正則運算式也必須作業。
uj5u.com熱心網友回復:
您的問題是您正在有效地嘗試從iftoelseif子句捕獲重疊匹配。您可以通過將正則運算式中的最后一個組設為前瞻來解決此問題。
(?:\.if|\.else(?:if)?)(.*?)(?=\.else|\.endif)
正則運算式 101 上的演示
請注意,為了避免捕獲條件(或簡化后處理它們),您需要更改正則運算式的第一組以允許if在.else. 我已經在上面進行了更改,但并不一定要讓正則運算式像您目前所做的那樣作業。
.if如果條件僅與/出現在同一行.elseif,您可以使用@CarySwoveland 的想法(見注釋)來避免捕獲條件:
(?:\.if|\.else(?:if)?).*\r?\n([\s\S]*?)(?=\.else|\.endif)
這需要洗掉DOTALL標志。請參閱演示。
uj5u.com熱心網友回復:
你可以匹配正則運算式
^(?![ \t]*\.(?:if|elseif|else|endif)\b).*
設定多行標志(導致^和$分別匹配每行的開頭,而不是字串的開頭和結尾)。
這匹配所有不以零個或多個空格或制表符開頭的行,后跟'.if',或。如果字串是下面顯示的字串,則包含的行和空行匹配。'.elseif''.else''.endif''code'
.if CONDITION1
code1
.elseif CONDITION2
code2
.code3
.code4
.elseif CONDITION3
code5
.else
code6
.endif
演示
正則運算式可以分解如下。
^ # match beginning of line
(?! # begin a negative lookahead
[ \t]* # match zero or more tabs or spaces
\. # match a period
(?:if|elseif|else|endif) # match one of the strings in the non-capture group
\b # match a word boundary
) # end negative lookahead
.* # match the line
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/465825.html
標籤:正则表达式
