如何获取以下示例中的所有匹配项:
// 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"
附言:我希望所有的比赛都以通用的方式进行。上面的例子只是一个例子。
发布于 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更具创新性的特性之一--随便说一下,我想不出有哪种方式能与之相媲美。关于它的官方文档很少(说得客气些),到目前为止,似乎没有很多开发人员使用它并在网上分享他们的经验。所以试一试,看看会发生什么。
发布于 2010-10-10 06:50:21
你不可能只从一个匹配中得到三个不同的结果。
如果只想匹配"ab“,可以使用ab.?
或a.{1}
(或许多其他选项)
如果只想匹配"abc“,可以使用ab.
或a.{2}
(或许多其他选项)
如果您只想匹配"abcd“,您可以使用ab.*
或a.{3}
(或许多其他选项)
https://stackoverflow.com/questions/3898210
复制相似问题