【问题标题】:Regex w/ balancing group that matches not only the outmost matches带有平衡组的正则表达式,不仅匹配最外面的匹配
【发布时间】:2013-04-02 07:05:57
【问题描述】:

我已经阅读了多个关于如何使用平衡组的资料,但所有示例都只匹配最外面的匹配项。是否可以用一个正则表达式匹配与模式匹配的所有子字符串? (平台为.NET 4.0)

这是我想要的一个例子: 输入:

a + ((b + (c + d)) + (e + f))

所需的匹配项(“教科书”RegEx 仅生成第一个匹配项):

  • ((b + (c + d)) + (e + f))
  • (b + (c + d))
  • (c + d)
  • (e + f)

【问题讨论】:

  • 这是什么语言的?许多语言都有不同风格的正则表达式。
  • 这是一个通用问题,即匹配任意数量的子组,还是针对具体情况进行描述?
  • @Daedalus .NET/C#。更新了问题。
  • @bmorris591 是的,这是一个通用问题。
  • 如果它是一个通用模式,那么正则表达式可能无法解决问题。您必须构建一个更具体的解析器来处理您的特定情况。

标签: c# .net regex


【解决方案1】:

这可以通过正则表达式在前瞻的帮助下完成。但这并不是最优的,因为它会为每场比赛“重新解析”一些括号组。使用真正的解析器只会读取/解析字符串一次,而且效率更高。

示例 (ideone):

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      var re = @"(?x)  # ignore spaces and comments
(?=                    # lookahead (zero width)
  (
    \(                 # first (
    (?:
      (?<open> \( )*   # open++
      [^()]+
      (?<-open> \) )*  # open--
    )+
    \)                 # last )
    (?(open)(?!))      # fail if unblanaced: open > 0
  )
)
\(                     # eat a (, to advance the match a char";

      var str = "a + ((b + (c + d)) + (e + f)) + (x + ((y) + (z)) + x)";

      var m = Regex.Matches(str, re);

      Console.WriteLine("Matched: ");
      foreach (Match i in m)
        Console.WriteLine(i.Groups[1]);
   }
}

输出:

Matched: 
((b + (c + d)) + (e + f))
(b + (c + d))
(c + d)
(e + f)
(x + ((y) + (z)) + x)
((y) + (z))
(y)
(z)

【讨论】:

  • 啊,向前看就行了。感谢您的回答,今晚将尝试!
【解决方案2】:

如果您使用的是 javascript,这里有一个适用于上述输入的示例,

var rgx = /\([a-z]+\s*\+\s*(\([a-z]+\s*\+\s*[a-z]+\s*\))\s*\)/g;
var str = 'a + (b + (c + d))';  
console.log(rgx.exec(str));

它不适用于像这样更多变量的东西,因为它只是一个简单的测试用例

a + (d + (c + e) + x)

【讨论】:

    猜你喜欢
    • 2015-11-13
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多