4

我有以下数据:

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 块内的所有变量?

4

3 回答 3

4

这有点骇人听闻,但您可以尝试添加负前瞻,如下所示:

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

这假设所有大括号都是平衡的,幸运的是嵌套应该无关紧要(而在类似的问题中通常会如此),因为您正在寻找括号外的案例。

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

人们很想以另一种方式扩展它以包含负面的lookbehind,但不幸的是大多数实现不支持可变长度的lookbehinds。

编辑:

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

/(?:char|int)\s*([A-Za-z0-9]*)\s*=\s*"([^"]*)"(?![^{]*\})/
                    ^^^                ^^^^^
于 2012-12-25T15:54:16.627 回答
0

看看这样的事情是否适合你:

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

或者只是^在你的表情前面放一个

于 2012-12-25T15:58:18.980 回答
0

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

/^(int|char).*$/

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

于 2012-12-25T16:28:27.620 回答