C#Regex中的贪婪,非贪婪,全贪婪匹配
如何在以下示例中获取所有匹配项:
// Only "abcd" is matched MatchCollection greedyMatches = Regex.Matches("abcd", @"ab.*"); // Only "ab" is matched MatchCollection lazyMatches = Regex.Matches("abcd", @"ab.*?"); // How can I get all matches: "ab", "abc", "abcd"
PS:我希望以通用方式获得所有比赛。 上面的例子只是一个例子。
你可以使用类似的东西:
MatchCollection nonGreedyMatches = Regex.Matches("abcd", @"(((ab)c)d)");
然后你应该有ab,abc和abcd的三个反向引用。
但是,说实话,这种正则表达式并没有太多意义,特别是当它变大时变得难以理解。
编辑:
MatchCollection nonGreedyMatches = Regex.Matches("abcd", @"ab.?");
你有一个错误。 这只能匹配ab和abc(读取:ab +任意(可选)字符
懒人版:
MatchCollection greedyMatches = Regex.Matches("abcd", @"ab.*");
是:
MatchCollection nonGreedyMatches = Regex.Matches("abcd", @"ab.*?");
如果存在解决方案,则可能涉及捕获组和RightToLeft选项:
string s = @"abcd"; Regex r = new Regex(@"(?<=^(ab.*)).*?", RegexOptions.RightToLeft); foreach (Match m in r.Matches(s)) { Console.WriteLine(m.Groups[1].Value); }
输出:
abcd abc ab
我说“if”因为虽然它适用于你的简单测试用例,但我不能保证这个技巧会对你的现实问题有所帮助。 RightToLeft
模式是.NET的一个更具创新性的function - 随便,我想不出另外一种与它相当的东西。 关于它的官方文档很少(温和地说),到目前为止,似乎没有很多开发人员使用它并在线分享他们的经验。 所以尝试一下,看看会发生什么。
只有一场比赛你不能得到三个不同的结果。
如果你只想匹配“ab”,你可以使用ab.?
或者a.{1}
(或许多其他选项)
如果你只想匹配“abc”,你可以使用ab.
或者a.{2}
(或许多其他选项)
如果你只想匹配“abcd”你可以使用ab.*
或a.{3}
(或许多其他选项)
上述就是C#学习教程:C#Regex中的贪婪,非贪婪,全贪婪匹配分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/991600.html