【问题标题】:Regex match with multiple delimiters正则表达式匹配多个分隔符
【发布时间】:2018-03-27 21:53:43
【问题描述】:

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

\(([^)]*)\)

所以

*-(你好)+(世界)-

返回两个匹配项

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

我正在尝试但未能对其进行修改,以便我还将中间的部分作为自己的匹配项。喜欢:

  1. *-
  2. (你好)
  3. +
  4. (世界)
  5. -

有可能吗?

【问题讨论】:

  • 编程语言是什么?
  • C#我把它添加到问题中
  • Regex.Split(s, @"(\([^)]*\))")。或Regex.Split(s, @"\(([^)]*)\)") 取决于您是否需要保留括号。
  • 哇!太简单。我不知道有什么区别。想把它变成一个答案,我可以接受吗?
  • 这很容易使用您的正则表达式,因为它不包含带有“技术”捕获组的反向引用。然后,它会提取太多,因为您无法将捕获组转换为非捕获。

标签: c# regex


【解决方案1】:

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

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

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

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

regex demo

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

【讨论】:

    【解决方案2】:

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

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

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

    这会给你:

    *-
    (Hello)
    +
    (World)
    -
    

    Demo C#

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多