正则表达式,匹配花括号外的字符{}

时间:2012-12-25 15:44:04

标签: regex

我有以下数据:

int  time="1356280261"
char value="3000"

bankLine {
  char value="3000"
  char currency="EUR"
  int  time="1356280261"
} #bankLine

我正在递归地解析这些数据,只想分别匹配块外的2个变量

我确实有这个正则表达式匹配变量

/(?:char|int)\s*([A-z0-9]*)\s*=\s*"(.*)"/

然而,正则表达式也匹配块内的所有事件。

如何才能单独匹配前2个变量并忽略bankLink-block中的所有变量?

3 个答案:

答案 0 :(得分:3)

这有点像hackish,但你可以尝试添加一个负面的前瞻,像这样:

/(?:char|int)\s*([A-z0-9]*)\s*=\s*"(.*)"(?![^{]*\})/
                                        ^^^^^^^^^^^

这假设所有大括号都是平衡的,幸运的是嵌套应该无关紧要(通常情况下,类似的问题),因为你正在寻找括号外的情况。

前瞻是基于这样的观察:如果你遇到一个没有遇到开括号的近支撑,那么我们可以合理地假设我们在支撑内。

有人试图以另一种方式对此进行扩展,以包含背后的,但不幸的是,大多数实现都不支持可变长度的lookbehinds。

修改

如下面的评论中所述,建议使用以下修复程序:

/(?:char|int)\s*([A-Za-z0-9]*)\s*=\s*"([^"]*)"(?![^{]*\})/
                    ^^^                ^^^^^

答案 1 :(得分:0)

看看这样的东西是否适合你:

^(?:char|int)[^\n\r]*?$

或者只是在表达式前加上^

答案 2 :(得分:0)

这可能不是最佳解决方案,但我认为这适用于您的情况:

/^(int|char).*$/

原因是你的声明在bankLine块中缩进。这就是我们在这里利用的东西。我们只是匹配以int或char开头的所有行,它们在开头没有任何空格。