使用正则表达式查找嵌套括号

时间:2017-04-16 10:16:01

标签: c# regex parentheses

我有这个字符串:

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)

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

你有意这样吗?

&#34;??(= TABLEXY1 +()\ S +(= * PARAM2 *)&#34;

我得到的答案是:TABLEXY1((INITIALPARAM2 * 117.3 / MADAD(2)),INITIALPARAM1 + 1)