我很难理解为什么以下表达式 \\[B.+\\]
和代码返回匹配计数 1:
string r = "\\[B.+\\]";
return Regex.Matches(Markup, sRegEx);
我想找到所有以 BMarkup 中) > 并括在方括号中。
如果标记包含 [BName]
,我会得到一个匹配项 - 好。
如果标记包含 [BName] [BAddress]
,我会得到一个匹配 - 为什么?
如果标记包含 [BName][BAddress]
,我也只会得到一个匹配项。
在某些基于 Web 的正则表达式测试器上,我注意到如果文本包含 CR 字符,我将在每行中获得一个匹配项 - 但我需要某种方式来指定我希望独立于换行符返回匹配项。
我还在 MatchCollection 的 Groups 和 Captures 集合中四处寻找,但无济于事 - 总是只有一个结果。
最佳答案
您只能获得一个匹配项,因为默认情况下,.NET 正则表达式是“贪婪的”;他们尝试尽可能多地匹配一次。
因此,如果您的值为 [BName][BAddress]
,您将有一个匹配项 - 它将匹配整个字符串;所以它将匹配从开头的 [B
一直到 last ]
- 而不是第一个。如果您想要两个匹配项,请改用此模式:\\[B.+?\\]
+
之后的 ?
告诉匹配引擎尽可能少地匹配...让第二组自己匹配。
Slaks 也提到了一个很好的选择;具体指定您不希望将结尾 ]
匹配为内容的一部分,如下所示:\\[B[^\\]]+\\]
这让你的比赛保持“贪婪”,这在其他一些情况下可能很有用。在这个特定实例中,可能没有太大区别 - 但根据您可能具体处理的数据/模式,记住这一点很重要。
附带说明一下,我建议对正则表达式模式使用 C#“文字字符串”说明符 @
,这样您就不需要对正则表达式模式中的内容进行双重转义;所以我会像这样设置模式:
string pattern = @"\[B.+?\]";
这使得更容易找出更复杂的正则表达式
关于c# - Regex.Matches 每行返回一个匹配项,而不是每个 "word",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5860451/