c# - Regex.Matches 每行返回一个匹配项,而不是每个 "word"

标签 c# .net regex

我很难理解为什么以下表达式 \\[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/

相关文章:

javascript - JavaScript 中要忽略的单词列表?

Python 匹配贪婪短语搜索。

c# - 通过反射查找可空属性的类型

c# - 加密 Unity c# 标注到 Node js 服务器

4.0 和 4.5.1 的 ASP.NET Web Farm 导致无效的回发或回调参数异常

c# - 如何在 WPF 窗口关闭后调用方法?

regex - 找到匹配项时使用 sed 替换行首

c# - 托管函数在非托管结构(C++、C#)中作为回调函数传递的问题

c# - XAML 绑定(bind)不适用于依赖属性?

c# - 在单元测试中进行多次调用而不使用 for 循环