首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C#正则表达式中的贪婪、非贪婪、全贪婪匹配

C#正则表达式中的贪婪、非贪婪、全贪婪匹配
EN

Stack Overflow用户
提问于 2010-10-10 06:48:30
回答 2查看 40.1K关注 0票数 23

如何获取以下示例中的所有匹配项:

// 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"

附言:我希望所有的比赛都以通用的方式进行。上面的例子只是一个例子。

EN

回答 2

Stack Overflow用户

发布于 2010-10-10 09:05:33

如果存在解决方案,则可能涉及到捕获组和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

我说“如果”是因为,虽然它适用于你的简单测试用例,但我不能保证这个技巧会帮助你解决现实世界中的问题。RightToLeft模式是.NET更具创新性的特性之一--随便说一下,我想不出有哪种方式能与之相媲美。关于它的官方文档很少(说得客气些),到目前为止,似乎没有很多开发人员使用它并在网上分享他们的经验。所以试一试,看看会发生什么。

票数 6
EN

Stack Overflow用户

发布于 2010-10-10 06:50:21

你不可能只从一个匹配中得到三个不同的结果。

如果只想匹配"ab“,可以使用ab.?a.{1} (或许多其他选项)

如果只想匹配"abc“,可以使用ab.a.{2} (或许多其他选项)

如果您只想匹配"abcd“,您可以使用ab.*a.{3} (或许多其他选项)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3898210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档