簡體   English   中英

正則表達式匹配由任何字符分組包圍的可選組

[英]Regex Match Optional Group Surrounded by Any Character Grouping

我正在嘗試匹配一個可選組,該組可以在任意數量的字符之前和之后。 整個模式也有一個必需的開始和結束匹配,但中間匹配是可選的。

我從這個開始,它在需要中間組時起作用:

string text = @"blah blah foo This is a test blah.  the test does not work. bar";
string  requiredBlah = @"(foo).*?(blah).*?(bar)";
Match m = Regex.Match(text, requiredBlah);

結果是“foo”、“blah”、“bar”。

但是,當中間組是可選的時,我猜正則表達式引擎的機制更喜歡不匹配中間組。

string optionalBlah = @"(foo).*?(blah)?.*?(bar)";

結果:“foo”、“”、“bar”。

這個SO answer說如果在可選組之前和之后有分隔符,我可以捕獲中間的可選組,但這不是我的情況。

我可以完全跳過可選組並使用string.Contains("blah") ,但我想知道是否有針對此類問題的純正則表達式解決方案。 我的目標是設計與通用模式匹配的正則表達式,具有多個可選部分,以便我可以確定缺少模式的哪些部分。

這個問題很常見。 第二個點匹配模式抓住了blah並且不必將其歸還給(blah)? 因為它是可選的(請參閱此演示,其中我將捕獲組添加到原始正則表達式以顯示哪些組匹配blah )。

在此處輸入圖片說明

最簡單的解決方案是將惰性.*? 模式和(blah)捕獲組到一個可選的非捕獲組(即(?:.*?(blah))? )以使正則表達式引擎嘗試匹配組模式至少一次(= greedily ):

(foo)(?:.*?(blah))?.*?(bar)

請參閱正則表達式演示 這里, (foo)捕獲了 Group 1 中的foo(?:.*?(blah))? 匹配 0 個或更多字符的可選序列,除換行符之外,盡可能少,然后將blah捕獲到組 2 中,然后.*?(bar)匹配 0 個或更多除換行符以外的字符,盡可能少然后將bar捕獲到組 3 中:

在此處輸入圖片說明

另一種解決方案是使用前瞻來限制點匹配(使用所謂的緩和貪婪令牌):

(foo)(?:(?!blah).)*(blah)?.*?(bar)
     ^^^^^^^^^^^^^^

請參閱正則表達式演示 (?:(?!blah).)*模式匹配直到第一個blah任何文本。 (如果它在模式的末尾,它也可能匹配到字符串的末尾。)

在此處輸入圖片說明

在這兩種情況下,我都能夠使用or運算符使其工作

(foo).*?(blah).*?(bar)|(foo).*?(bar)

演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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