如何在C#中使用正则捕获逗号分隔的双词组合?
问题:捕获空格分隔的连续两个单词的正则表达式
我正在编写正则表达式,用来捕获文本中由空格分隔的两个连续单词,测试文本如下:
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 Harvey、Martin 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]+)*\b"; //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 = 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(" ")}"); }
编辑1
我用模式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.");
内容的提问来源于stack exchange,提问作者user23077506
相关产品推荐
相关产品推荐

