gpt4 book ai didi

c# - 正则表达式匹配由任何字符分组包围的可选组

转载 作者:行者123 更新时间:2023-11-30 23:27:59 25 4
gpt4 key购买 nike

我正在尝试匹配一个可选组,该组前后可以有任意数量的字符。整个模式也有一个必需的开始和结束匹配,但中间匹配是可选的。

我从这个开始,它在需要中间组时有效:

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)? 因为它是可选的(参见 this demo 我在其中添加了捕获组显示匹配 blah 组的原始正则表达式)。

enter image description here

最简单的解决方案是将惰性 .*? 模式和 (blah) 捕获组包含在可选的非捕获组中(即 (? :.*?(blah))?) 让正则表达式引擎尝试匹配组模式至少一次(= 贪婪地):

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

参见 regex demo .这里,(foo) 捕获第 1 组中的 foo(?:.*?(blah))? 匹配可选序列 0 或除了换行符之外的更多字符,尽可能少,然后将 blah 捕获到第 2 组,然后 .*?(bar) 匹配 0 或更多行以外的字符尽可能少地打断字符,然后将 bar 捕获到第 3 组:

enter image description here

另一种解决方案是通过前瞻来限制点匹配(使用所谓的 tempered greedy token ):

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

参见 regex demo . (?:(?!blah).)* 模式匹配第一个 blah 之前的任何文本。 (如果它在模式的末尾,它也可能匹配到字符串的末尾。)

enter image description here

关于c# - 正则表达式匹配由任何字符分组包围的可选组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36205484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com