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

Find nested parentheses with regex

我有这个字符串:

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

我需要能够获取括号中包含其值的 TABLEXY1。 可能的值有:

(个数)

(表达式)

(数字,数字)

(数字,表达式)

(表达式,表达式)

(表达式,数字)

我不知道会有多少括号。

我试过了

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

但它给了我

TABLEXY1((INITIALPARAM2*117.3/MADAD(2)

不是我需要的

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

你是故意的吗?

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

我得到的答案是:TABLEXY1((INITIALPARAM2*117.3/MADAD(2)),INITIALPARAM1+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)