【发布时间】: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))
我该怎么做?
【问题讨论】:
这是我的模式:(TABLE[0-9]+)\(((?<=\()(.*?)(?=\)))[(?=\))\)]
这是我正在查看的字符串:(TABLE3(1.6+TABLE1(2)))*TABLE2(1)*TABLE11(1)*(1.19017735023328)
我得到的是:
我需要第一个是:TABLE3(1.6+TABLE1(2))
我该怎么做?
【问题讨论】:
在TABLE[0-9]+ 之后使用balancing group 构造:
TABLE[0-9]+\((?>[^()]|(?<o>)\(|(?<-o>)\))*(?(o)(?!))\)
请参阅regex demo。
详情
TABLE[0-9]+ - 匹配 TABLE 和 1+ 位\( - 一个开放的(
(?>[^()]|(?<o>)\(|(?<-o>)\))* - 零次或多次出现
[^()] - 任何字符,但 ( 和 )
| - 或(?<o>)\( - 一个 ((并增加 o 组的堆栈)| - 或(?<-o>)\) - 一个 )(并减少 o 组的堆栈)(?(o)(?!)) - 如果组 o 堆栈不为空,则匹配失败(触发回溯)\) - )。 【讨论】:
( 或) 存储在组“o”的CaptureCollection 中的事实。您也可以将空值存储在堆栈中。我的解决方案只是加起来然后删除空字符串,而你加起来并删除 ( 和 ) 字符。好吧,这意味着计数组的括号似乎没有关闭不是正确的陈述。