【问题标题】:Regex finding string with parenthesis in another string with parenthesis正则表达式在另一个带括号的字符串中查找带括号的字符串
【发布时间】:2017-08-28 13:51:24
【问题描述】:

这是我的模式:(TABLE[0-9]+)\(((?<=\()(.*?)(?=\)))[(?=\))\)]

这是我正在查看的字符串:(TABLE3(1.6+TABLE1(2)))*TABLE2(1)*TABLE11(1)*(1.19017735023328)

我得到的是:

  • 表3(1.6+表1(2)
  • 表 2(1)
  • 表 11(1)

我需要第一个是:TABLE3(1.6+TABLE1(2))

我该怎么做?

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    TABLE[0-9]+ 之后使用balancing group 构造:

    TABLE[0-9]+\((?>[^()]|(?<o>)\(|(?<-o>)\))*(?(o)(?!))\)
    

    请参阅regex demo

    详情

    • TABLE[0-9]+ - 匹配 TABLE 和 1+ 位
    • \( - 一个开放的(
    • (?&gt;[^()]|(?&lt;o&gt;)\(|(?&lt;-o&gt;)\))* - 零次或多次出现
      • [^()] - 任何字符,但 ()
      • | - 或
      • (?&lt;o&gt;)\( - 一个 ((并增加 o 组的堆栈)
      • | - 或
      • (?&lt;-o&gt;)\) - 一个 )(并减少 o 组的堆栈)
    • (?(o)(?!)) - 如果组 o 堆栈不为空,则匹配失败(触发回溯)
    • \) - )

    【讨论】:

    • 感谢您对平衡如何工作的非常详细的解释。对我来说令人困惑的部分是 (?)\( 或 (?)\)。计数组的括号似乎没有关闭。我已经更改了正则表达式以平衡计数组中的括号,它仍然可以正常工作。表[0-9]+\(([^()]|(?\()|(?\)))*(?(o)(?!))\)。我在这里错过了什么?
    • @LetzerWille:您错过了不需要将() 存储在组“o”的CaptureCollection 中的事实。您也可以将空值存储在堆栈中。我的解决方案只是加起来然后删除空字符串,而你加起来并删除 () 字符。好吧,这意味着计数组的括号似乎没有关闭不是正确的陈述。
    猜你喜欢
    • 2015-08-26
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2021-11-24
    • 1970-01-01
    相关资源
    最近更新 更多