首页 > 解决方案 > 使用正则表达式抓取多个匹配的字符串

问题描述

我正在创建一个程序,该程序使用以下正则表达式获取给定文档中的所有名称。

string pattern = @"(?<=Name)[\s](.*?)[\s]";

但是,如果文档中有名称但在不同的上下文中使用,则此正则表达式将不起作用。因此,我在下面修改了我的代码。

string pattern @"(?<=Name:[\s])(.*?)[\s]";

然而,即使这个正则表达式有效,它也只运行一次并输出它找到的第一个名称,这与显示的第一个正则表达式不同

已编辑 ——— 文档有一系列名称,例如 姓名:约翰 姓名:简 姓名:玛丽

下面会有一个句子,但是使用了名称这个词,我想要的只是名称后面的单词:在整个文档中被抓取。

我用来触发输出的是:

 If (MatchesPattern.success)
  { 
   RegexWriter(pattern.value, fileName)

  }

标签: c#regex

解决方案


我猜,

^Name:\s*(\S+)\s*$

可能会奏效。

测试

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"^Name:\s*(\S+)\s*$";
        string input = @"Name: John
Name: Jane  
Name: Mary 

a sentence here with name in it would be fine. ";
        RegexOptions options = RegexOptions.Multiline;

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

C# 演示


如果您想简化/修改/探索表达式,它已在regex101.com的右上角面板中进行了说明。如果您愿意,您还可以在此链接中观看它如何与一些示例输入匹配。


正则表达式电路

jex.im可视化正则表达式:

在此处输入图像描述


推荐阅读