我有以下数据:
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中的所有变量?
答案 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开头的所有行,它们在开头没有任何空格。