【问题标题】:Find nested parentheses with regex [duplicate]使用正则表达式查找嵌套括号[重复]
【发布时间】:2017-09-12 03:56:39
【问题描述】:

我有这个字符串:

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\((?:[^()]+|(?&lt;o&gt;)\(|(?&lt;-o&gt;)\))*(?(o)(?!))\)
  • 虽然 .net 正则表达式不支持递归,但它可以将嵌套结构与平衡结构相匹配。

标签: c# regex parentheses


【解决方案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)

【讨论】:

  • 这是查找嵌套括号的好方法。我能够在 AutoHotkey 中使用这个表达式来排除不在嵌套括号中的逗号。我发布了一个问答here
【解决方案2】:

你是故意的吗?

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

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

【讨论】:

  • 不,你不能具体,我不知道第一个(主要)括号中的内容。你在哪里检查的?我不一样
  • powershell...我没有指定任何内容..我在你看到之后说(拿走所有东西,直到你看到 PARAM2 这个词..
猜你喜欢
  • 2021-10-15
  • 2020-02-14
  • 1970-01-01
  • 2014-10-09
  • 2012-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-14
相关资源
最近更新 更多