正则表达式与多个分隔符匹配

时间:2018-03-27 13:05:08

标签: c# regex

我有一个正则表达式,可以在引号之间取出字符串的所有部分。

  

\(([^)]*)\)

所以

  

* - (Hello)+(世界) -

返回两场比赛

  
      
  1. (你好)
  2.   
  3. (世界)
  4.   

我正在尝试但未能修改它,以便我也将它们之间的部分作为自己的匹配。像:

  
      
  1. * -
  2.   
  3. (你好)
  4.   
  5. +
  6.   
  7. (世界)
  8.   
  9. -
  10.   

甚至可能吗?

2 个答案:

答案 0 :(得分:0)

您可以使用alternation匹配括号中的字符\([^)]*\)|匹配字符类[*+-]+中列出的字符的一次或多次

\([^)]*\)|[*+-]+

string pattern = @"\([^)]*\)|[*+-]+";
string input = @"*- (Hello) + (World) - ";
foreach (Match m in Regex.Matches(input, pattern))
{
    Console.WriteLine(m.Value);
}

那会给你:

*-
(Hello)
+
(World)
-

Demo C#

答案 1 :(得分:0)

在这种情况下,使用当前的正则表达式,您可以将Regex.Split与包含在捕获组中的模式一起使用:

var tokens = Regex.Split(s, @"(\([^)]*\))");

甚至,当匹配发生在前导/尾随位置时:

var tokens = Regex.Split(s, @"(\([^)]*\))").Where(m => !string.IsNullOrEmpty(m));

请参阅regex demo

enter image description here

请注意,您可能需要将正则表达式中的所有捕获组替换为非捕获组才能使用此功能。当你使用"技术"捕获组以便稍后使用反向引用,您必须使用多个匹配构建不匹配的子串数组,并使用匹配位置的信息在输入上调用.Substring()