我很难理解为什么以下表达式\\[B.+\\]和代码返回匹配计数为1:
string r = "\\[B.+\\]";
return Regex.Matches(Markup, sRegEx);
Run Code Online (Sandbox Code Playgroud)
我想找到所有实例(让我们称之为'标签')(在一个不包含换行符的可变长度HTML字符串标记中),以B为前缀并用方括号括起来.
如果标记包含[BName],我得到一个匹配 - 好.
如果标记包含[BName] [BAddress],我得到一个匹配 - 为什么?
如果标记包含[BName][BAddress],我也只得到一个匹配.
在一些基于网络的正则表达式测试人员中,我注意到如果文本包含CR字符,我将获得每行匹配 - 但我需要一些方法来指定我希望返回的匹配独立于换行符.
我也在MatchCollection的Groups和Captures集合中徘徊,但无济于事 - 总是只有一个结果.
你只得到一个匹配,因为默认情况下,.NET正则表达式是"贪婪的"; 他们尝试尽可能地匹配一场比赛.
所以如果你的价值是[BName][BAddress]你将有一个匹配 - 这将匹配整个字符串; 因此它将从[B开头一直到最后一个 匹配]- 而不是第一个.如果您想要两个匹配,请改用此模式:\\[B.+?\\]
在?后+告诉匹配引擎,以尽可能少的匹配......离开第二组是其自己的比赛.
Slaks还指出了一个很好的选择; 具体指定你不希望将结尾]作为内容的一部分进行匹配,如下所示:\\[B[^\\]]+\\]这使得你的匹配"贪婪",这在其他情况下可能会有用.在这个特定的例子中,可能没有太大的区别 - 但是根据您可能正在处理的数据/模式,要记住这一点很重要.
另外,我建议在@正则表达式模式中使用C#"文字字符串"说明符,这样就不需要在正则表达式模式中双重转义; 所以我会像这样设置模式:
string pattern = @"\[B.+?\]";
Run Code Online (Sandbox Code Playgroud)
这使得更容易找出更复杂的正则表达式
| 归档时间: |
|
| 查看次数: |
2585 次 |
| 最近记录: |