[英]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
任何文本。 (如果它在模式的末尾,它也可能匹配到字符串的末尾。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.