我一直在使用正则表达式创建一个模式,该模式将捕获一个单词,然后是空格,然后是另一个单词,如下面的示例所示:

string ToSearch = "Hello Steve steve, Martin martin, Scott scott to ASP.Net Program";
string ToSearch2 = "Hello Steve steve, Martin martin, Scott scott, Harry harry, Peter peter, Ron ron to ASP.Net Program";
string ToSearch3 = "Hello Steve steve, Martin martin, Scott scott, Harry harry, Peter peter, Ron ron, Will will, smith Smith to ASP.Net Program";
string ToSearch4 = "Hello Steve Harvey, Martin Lawrence, Scott Hardy, Harry Potter, Peter Pan, Ron Wesley, Will Smith, mr Smith to ASP.Net Program";

所以,我想获取例如Steve HarveyMartin Lawrence等匹配的列表,但我似乎无法使用正确的模式.

以下是我使用的模式

//string pattern = @"[a-zA-Z]+(,[\s]+[\D]+)";
//string pattern = @"\b[a-zA-Z]+(?:,[\s]+[a-zA-Z]+)*\b"; // Working
//string pattern = @"\b[a-zA-Z]+[\s]+[a-zA-Z]+(?:[\s]+[a-zA-Z]+)*\b";
//string pattern = @"\b[a-zA-Z]+(?:[\s]+[a-zA-Z]+)*(?:,[\s]+[a-zA-Z]+(?:[\s]+[a-zA-Z]+)*)*\b";
//string pattern = @"\b[a-zA-Z]+(?:\s+[a-zA-Z]+)*(?:,\s*[a-zA-Z]+(?:\s+[a-zA-Z]+)*)*\b";
//string pattern = @"(?<!\w)(?:[A-Za-z]+(?: [A-Za-z]+)*)(?!\w)";
//string pattern = @"\b[a-zA-Z]+([\s]+[a-zA-Z]*(?:,[\s]+[a-zA-Z]+))+[\s]+[a-zA-Z]*\b";
//string pattern = @"\b[\D]+\s+[\D]*\b";
//string pattern = @"\b([A-Z][a-z]*)\s*([a-z]+)(?=\s*,|\s|$)"; // Best
//string pattern = @"\b([\D]*)\s*([\D]+)(?=\s*,|\s|$)"; // Best
//string pattern = @"\b(\w+)\s+\1\b";
//string pattern = @"\b(\w+)\s+\b(\1|\1\w+)";
//string pattern = @"\b(\w+)\b.*?(?i:\1)\b";
//string pattern = @"\b([A-Za-z]*\s*[A-Za-z])\s+([a-zA-Z]+)";
//string pattern = @"\b[A-Za-z]*\s*([A-Za-z]+)(?=\s*,|\s|$)";
//string pattern = @"\b([A-Za-z])+\s+([A-Za-z]+)(?=\s*,)"; // Almost
//string pattern = @"\b([A-Za-z]+)\s+([A-Za-z]+)(?=\s*,|\s*$)";
//string pattern = @"\b[a-zA-Z]+[\s]+[a-zA-Z]+(?:,[\s]+[a-zA-Z]+)*\b";
//string pattern = @"\b[a-zA-Z]+(?:,[\s]+[a-zA-Z]+)+(?:,[\s]+[a-zA-Z]+)*";
//string pattern = @"\b[a-zA-Z]+(?:,[\s]+[a-zA-Z])+(?:[\s]+[a-zA-Z]+)*\b";
//string pattern = @"\b[a-zA-Z]+(?:,[\s]+[0-9a-zA-Z])?(?:,[\s]+[a-zA-Z]+(?:,[\s]+[0-9a-zA-Z])+)*\b";

我做错了什么?另外,你能为我提供一个网站/博客/视频教程,详细解释如何在c#中使用regex吗?

正则表达式的框架代码:

Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);
System.Diagnostics.Debug.WriteLine($"Regex Result: {regex.IsMatch(ToSearch)}");

Assert.IsTrue(regex.IsMatch(ToSearch));

foreach(Match m in regex.Matches(ToSearch)) 
{
    System.Diagnostics.Debug.WriteLine($"Regex Result: {m.Value}");
    System.Diagnostics.Debug.WriteLine($"Regex Result contains space: {m.Value.Contains(" ")}");
}

100

以下是来自模式string pattern = @"(\w+\s+\w+(?=,))|((?<=,\s*\w+\s+\w+))";的查询结果

Debug Trace:
Regex Result: True
Regex Result: Steve steve
Regex Result: Martin martin
Regex Result: 
Regex Result: 
Regex Result: 
Regex Result: 
Regex Result: 
Regex Result: 
Regex Result2: True
Regex Result2: Steve steve
Regex Result2: Martin martin
Regex Result2: 
Regex Result2: Scott scott
Regex Result2: 
Regex Result2: Harry harry
Regex Result2: 
Regex Result2: Peter peter
Regex Result2: 
Regex Result2: 
Regex Result2: 
Regex Result2: 
Regex Result3: True
Regex Result3: Steve steve
Regex Result3: Martin martin
Regex Result3: 
Regex Result3: Scott scott
Regex Result3: 
Regex Result3: Harry harry
Regex Result3: 
Regex Result3: Peter peter
Regex Result3: 
Regex Result3: Ron ron
Regex Result3: 
Regex Result3: Will will
Regex Result3: 
Regex Result3: 
Regex Result3: 
Regex Result3: 
Regex Result3: 
Regex Result3: 
Regex Result4: True
Regex Result4: Steve Harvey
Regex Result4: Martin Lawrence
Regex Result4: 
Regex Result4: Scott Hardy
Regex Result4: 
Regex Result4: Harry Potter
Regex Result4: 
Regex Result4: Peter Pan
Regex Result4: 
Regex Result4: Ron Wesley
Regex Result4: 
Regex Result4: Will Smith
Regex Result4: 
Regex Result4: 
Regex Result4: 
Regex Result4: 
Regex Result4: 
Regex Result4: 
Test assertions passed successfully.

以下是我的代码测试:

        string ToSearch = "Hello Steve steve, Martin martin, Scott scott to ASP.Net Program";
        //string ToSearch = "Hello Steve steve, Martin martin, Scott scott, Harry harry, Peter peter, Ron ron to ASP.Net Ptogram";

        Regex regex = new Regex(pattern);
        System.Diagnostics.Debug.WriteLine($"Regex Result: {regex.IsMatch(ToSearch)}");

        Assert.IsTrue(regex.IsMatch(ToSearch));

        foreach(Match m in regex.Matches(ToSearch)) 
        {
            System.Diagnostics.Debug.WriteLine($"Regex Result: {m.Value}");
            //System.Diagnostics.Debug.WriteLine($"Regex Result contains space: {m.Value.Contains(" ")}");
        }

        string ToSearch2 = "Hello Steve steve, Martin martin, Scott scott, Harry harry, Peter peter, Ron ron to ASP.Net Program";

        System.Diagnostics.Debug.WriteLine($"Regex Result2: {regex.IsMatch(ToSearch2)}");

        Assert.IsTrue(regex.IsMatch(ToSearch2));

        foreach (Match m in regex.Matches(ToSearch2))
        {
            System.Diagnostics.Debug.WriteLine($"Regex Result2: {m.Value}");
            //System.Diagnostics.Debug.WriteLine($"Regex Result contains space2: {m.Value.Contains(" ")}");
        }

        string ToSearch3 = "Hello Steve steve, Martin martin, Scott scott, Harry harry, Peter peter, Ron ron, Will will, smith Smith to ASP.Net Program";

        System.Diagnostics.Debug.WriteLine($"Regex Result3: {regex.IsMatch(ToSearch3)}");

        Assert.IsTrue(regex.IsMatch(ToSearch3));

        foreach (Match m in regex.Matches(ToSearch3))
        {
            System.Diagnostics.Debug.WriteLine($"Regex Result3: {m.Value}");
            //System.Diagnostics.Debug.WriteLine($"Regex Result contains space3: {m.Value.Contains(" ")}");
        }

        string ToSearch4 = "Hello Steve Harvey, Martin Lawrence, Scott Hardy, Harry Potter, Peter Pan, Ron Wesley, Will Smith, mr Smith to ASP.Net Program";

        System.Diagnostics.Debug.WriteLine($"Regex Result4: {regex.IsMatch(ToSearch4)}");

        Assert.IsTrue(regex.IsMatch(ToSearch4));

        foreach (Match m in regex.Matches(ToSearch4))
        {
            System.Diagnostics.Debug.WriteLine($"Regex Result4: {m.Value}");
            //System.Diagnostics.Debug.WriteLine($"Regex Result contains space2: {m.Value.Contains(" ")}");
        }

        // Print a success message to the trace
        System.Diagnostics.Debug.WriteLine("Test assertions passed successfully.");

推荐答案

前两个单词前面没有逗号,而最后两个单词后面也没有逗号.因此,我们必须区分由OR(正则表达式|)分隔的两个 case :

\w+\s+\w+(?=,)|(?<=,\s*)\w+\s+\w+

我们有

  • pos(?=exp)匹配后缀EXP之前的任何位置,如:\w+\s+\w+(?=,),匹配两个后跟逗号的单词.
  • (?<=exp)pos匹配前缀EXP后面的任何位置:(?<=,\s*)\w+\s+\w+,匹配前面有逗号和可能还有空格的两个单词.

请注意,在环视图pos(?=exp)(?<=exp)pos中,只有pos匹配,而exp(即逗号和前导空格)不会是结果的一部分.

string[] examples = [
    "Hello Steve steve, Martin martin, Scott scott to ASP.Net Program",
    "Hello Steve steve, Martin martin, Scott scott, Harry harry, Peter peter, Ron ron to ASP.Net Program",
    "Hello Steve steve, Martin martin, Scott scott, Harry harry, Peter peter, Ron ron, Will will, smith Smith to ASP.Net Program",
    "Hello Steve Harvey, Martin Lawrence, Scott Hardy, Harry Potter, Peter Pan, Ron Wesley, Will Smith, mr Smith to ASP.Net Program"
];
var regex = new Regex(@"\w+\s+\w+(?=,)|(?<=,\s*)\w+\s+\w+");
foreach (string example in examples) {
    Console.WriteLine("==> " + example);
    foreach (Match match in regex.Matches(example)) {
        Console.WriteLine("    " + match.Value);
    }
}
Console.ReadKey();

打印:

==> Hello Steve steve, Martin martin, Scott scott to ASP.Net Program
    Steve steve
    Martin martin
    Scott scott
==> Hello Steve steve, Martin martin, Scott scott, Harry harry, Peter peter, Ron ron to ASP.Net Program
    Steve steve
    Martin martin
    Scott scott
    Harry harry
    Peter peter
    Ron ron
==> Hello Steve steve, Martin martin, Scott scott, Harry harry, Peter peter, Ron ron, Will will, smith Smith to ASP.Net Program
    Steve steve
    Martin martin
    Scott scott
    Harry harry
    Peter peter
    Ron ron
    Will will
    smith Smith
==> Hello Steve Harvey, Martin Lawrence, Scott Hardy, Harry Potter, Peter Pan, Ron Wesley, Will Smith, mr Smith to ASP.Net Program
    Steve Harvey
    Martin Lawrence
    Scott Hardy
    Harry Potter
    Peter Pan
    Ron Wesley
    Will Smith
    mr Smith

Csharp相关问答推荐

错误NU 1301:无法加载源的服务索引

FileStream. FlushAsync()是否确保文件被写入磁盘?

更新产品但丢失产品ASP.NET Core的形象

在实体框架中处理通用实体&S变更跟踪器

当用户右键单击文本框并单击粘贴时触发什么事件?

在EF Core中,有没有什么方法可以防止在查询中写入相同的条件,而代之以表达式?

CS1660无法将lambda表达式转换为类型INavigationBase,因为它不是委托类型

C#普罗米修斯指标

EFR32BG22 BLE在SPP模式下与PC(Windows 10)不连接

具有类型识别的泛型方法

使用未赋值的、传递的局部变量

Visual Studio 17.8.0制表符自动完成问题--三缩进

从HTML元素获取 colored颜色

RavenDb:为什么在字符串==空的情况下过滤会过滤得太多?

ASP.NET Core 8 Web API:如何添加版本控制?

当要删除的子模型没有父模型的1:多属性时,如何告诉实体框架设置1:1 FK条目?

使用LibraryImport在多个dll中导入相同的函数

如何使用moq和xUnit对删除操作进行单元测试?

默认架构不存在EF核心迁移

MS Project读取项目自定义域