2012-12-25 95 views
3

,我有以下数据:正则表达式,大括号以外的字符匹配{}

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*"(.*)"/ 

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

如何仅匹配前两个变量并忽略bankLink-block内的所有变量?

+0

什么实现? PHP? JavaScript的? –

回答

3

这是一个有点hackish,但你可以尝试添加负先行,如:

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

这是假定所有括号是平衡的,幸运的嵌套结构不应该的问题(而通常它会,在类似的问题),因为你正在寻找案件外面括号。

向前看是基于这样的观察:如果遇到没有遇到开放大括号的大括号,那么我们可以合理地认为我们在大括号内。

有人试图扩大这种方式,以包括在之后的否定外观,但不幸的是大多数实现不支持可变长度lookbehinds。

编辑:

如在下面的评论中讨论,这些修补程序建议:

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

+1,但我将'A-z'改为'A-Za-z',因为ASCII'Z'和ASCII'a'之间有一些你不想匹配的非字母字符。 –

+0

@TimPietzcker - 谢谢,Tim。我刚刚从他的问题中贴上正则表达式来向他展示它的不同之处,但这是一个很好的观点。我也会编辑他的问题。 –

+0

好主意。另外,'“([^”] *)“'可能会比'”(。*)“'更好,但是由于似乎每行至多有一个键/值对,并且该dotall模式不是这不是什么大问题 –

0

看看这样的事情对你的作品:

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

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

0

这可能不是最好的解决办法,但我认为这会为你的情况下工作:

/^(int|char).*$/ 

的原因是,你声明的bankLine块内缩进。那就是我们在这里利用的。我们简单地匹配以int或char开始的所有行,这些行在开始时没有任何空格。