2

バランシング グループの使用方法に関する複数の情報源を読みましたが、すべての例は最も一致するもののみに一致しています。パターンに一致するすべての部分文字列を 1 つの RegEx と一致させることは可能ですか? (プラットフォームは.NET 4.0)

ここに私が欲しいものの例があります: 入力:

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

必要な一致 (「教科書」正規表現は最初の一致のみを生成します):

  • ((b + (c + d)) + (e + f))
  • (b + (c + d))
  • (ハ+ニ)
  • (e + f)
4

2 に答える 2

2

これは、先読みの助けを借りて正規表現で行うことができます。しかし、これは最適ではありません。マッチごとにいくつかの括弧のグループを「再解析」するからです。実際のパーサーを使用すると、文字列の読み取り/解析が 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)
于 2013-04-01T23:05:43.613 に答える
0

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)
于 2013-04-01T22:35:36.143 に答える