2017-04-16 8 views
-1

とネストされた括弧を探す:私はこの文字列を持っている正規表現

TABLEXY1((INITIALPARAM2*117.3/MADAD(2)),INITIALPARAM1+1)*PARAM2/100*(TABLE12(INITIALPARAM3)*PARAM3-(TABLE12(INITIALPARAM4)*PARAM4))" 

私はそれは括弧内の値でTABLEXY1を取得できるようにする必要があります。そこで posibble値は、次のとおり

(数)

(式)

(数、数)

(数、表現)

(式、式)

(式、数)

括弧の数がわからない。

私は

TABLEXY1\(((?<=\()(.*?)(?=\)))\) 

を試してみましたが、それは私に
TABLEXY1((INITIALPARAM2*117.3/MADAD(2) 

を与えたと私は

TABLEXY1((INITIALPARAM2*117.3/MADAD(2)),INITIALPARAM1+1) 
+1

使用 'TABLEXY1 \((?:[^()] +を|(? )\( '(?<-o>)\))*(?(o)(?!))\)' –

+0

.net regexは再帰をサポートしていませんが、ネストされた構造とバランスの取れた構造を一致させることができます。 –

答えて

1

、あなたが使用できます。

TABLEXY1(\(([^()]|(?1))*\)) 

Live Demo

を限り、私はC#の正規表現を知っているように再帰をサポートしていないのでので、代わりにあなただけのすべて一緒に正規表現をスキップすることができます。

var str = "TABLEXY1((INITIALPARAM2*117.3/MADAD(2)),INITIALPARAM1+1)*PARAM2/100*(TABLE12(INITIALPARAM3)*PARAM3-(TABLE12(INITIALPARAM4)*PARAM4))"; 

int match = str.IndexOf("TABLEXY1"); 

if (match != -1) 
{ 
    int begin = str.IndexOf("(", match) + 1; 
    int end = 0; 
    int parenthesisCount = 1; 

    for (int i = begin; i < str.Length; ++i) 
    { 
     char c = str[i]; 

     if (c == '(') 
      ++parenthesisCount; 
     else if (c == ')') 
      --parenthesisCount; 

     if (parenthesisCount == 0) 
     { 
      end = i; 
      break; 
     } 
    } 

    Console.WriteLine(str.Substring(match, end - match + 1)); 
} 

出力:

TABLEXY1((INITIALPARAM2*117.3/MADAD(2)),INITIALPARAM1+1) 
0

は、あなたがこのような何かを意味しなかった必要はないでしょうか?

"?。(= TABLEXY1 +()\ S +(= * PARAM2 *)?。"

私が得た答えは次のとおりです。TABLEXY1((INITIALPARAM2 * 117.3/MADAD(2))、INITIALPARAM1 + 1再帰がサポートされている場合)

+0

いいえ、あなたは特定することはできません、私は最初の(メイン)括弧内に何がわかりません。あなたはそれをどこで確認しましたか?私は同じを取得しない –

+0

パワーシェル...私は何も指定しなかった..私はあなたが見た後に言った(あなたが単語PARAM2を参照するまですべてを取る.. –

関連する問題