正则表达式获取所有匹配位置

3

让我们看一下这段代码片段

var input = @"
a:1
b:22

a:3
b:44
";

var pattern = @"b:([^\n]+)\n";
var match = Regex.Match(input, pattern);

我在匹配中得到的结果如下图所示。

我们如何获取b的值列表,例如{22, 44}?

我只能看到22。

enter image description here


应该有一个 NextMatch 方法。 - Allan S. Hansen
就我个人而言,我宁愿在这里执行两次分割(一次在 Environment.Newline 处,一次在 : 处),而不是使用正则表达式。 - Uwe Keim
1
你可以使用 Matches 代替 Match - Uwe Keim
3个回答

6

使用Matches方法而不是Match方法来一次性获取多个匹配项:

var matches = Regex.Matches(input, pattern);

for (int i = 0; i < matches.Count; i++ )
{
    var value = matches[i].Value;
}

或者使用foreach语法:

foreach (Match match in matches)
{
    var value = match.Value;
}

@WouterHuysentruit 不,他的意思是 foreach (Match match in matches) - Uwe Keim
是的,谢谢。最终结果是相同的,不过你可以用不同的方式实现同样的目标。 - Szymon

5

使用 Regex.Matches 方法代替 Regex.Match。以下是来自 MSDN 的示例:

string pattern = "a*";
string input = "abaabb";

foreach (Match m in Regex.Matches(input, pattern)) 
   Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);

如果您需要一个匹配值列表:

Regex.Matches(input, pattern).Select(m => m.Value).ToList();

2
返回一个新的Match对象,其中包含下一个匹配的结果,从上一个匹配字符的后面位置开始(即上一次匹配结束后的位置)。
更容易的方法是通过循环遍历所有匹配项。 Match.NextMatch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接