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

Regex 正则表达式,匹配大括号{}外的字符,regex,Regex,我有以下数据: int time="1356280261" char value="3000" bankLine { char value="3000" char currency="EUR" int time="1356280261" } #bankLine 我递归地解析这些数据,只想分别匹配块外的两个变量 我有这个正则表达式来匹配变量 /(?:char|int)\s*([A-z0-9]*)\s*=\s*"(.*)"/ 然而,正则表达式也匹配块内的所有引用 如何仅匹配前两

我有以下数据:

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

bankLine {
  char value="3000"
  char currency="EUR"
  int  time="1356280261"
} #bankLine
我递归地解析这些数据,只想分别匹配块外的两个变量

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

/(?:char|int)\s*([A-z0-9]*)\s*=\s*"(.*)"/
然而,正则表达式也匹配块内的所有引用


如何仅匹配前两个变量,而忽略bankLink块内的所有变量?

这有点老套,但您可以尝试添加一个负前瞻,如下所示:

/(?:char|int)\s*([A-z0-9]*)\s*=\s*"(.*)"(?![^{]*\})/
                                        ^^^^^^^^^^^
这假设所有大括号都是平衡的,幸运的是嵌套性不重要(而在类似的问题中通常是如此),因为您正在寻找括号外的情况

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

有人试图以另一种方式扩展它以包含负lookbehind,但不幸的是,大多数实现不支持可变长度lookbehind

编辑:

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

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

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

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

或者在表达式前面放一个
^
,这可能不是最好的解决方案,但我认为这对您的情况有效:

/^(int|char).*$/

原因是您的声明缩进在bankLine块中。这就是我们在这里利用的优势。我们只是简单地匹配所有以int或char开头的行,这些行的开头没有空格。

什么实现?PHP?Javascript?+1,但我将
A-z
更改为
A-Za-z
,因为在ASCII
z
和ASCII
A
之间存在一些您不想匹配的非字母字符。@TimPietzcker-谢谢,Tim。我只是粘贴了他问题中的正则表达式,以向他展示差异,但这是一个很好的观点。我也会编辑他的问题。好主意。而且,
“([^”]*)”
可能比
“(.*)更好“
,但因为似乎每行最多有一个键/值对,而且没有设置dotall模式,所以这不是什么大问题。@TimPietzcker-事实上,这是一个很好的观点。在设置了off-chance
dotall
的情况下,我认为
*
的贪婪可能会产生不想要的结果,即如果我们在大括号内,那么匹配所有内容直到我们在大括号外,然后应用(并匹配)负前瞻。我来编辑。我认为还可以做其他改进,但与此相比,这些改进似乎微不足道。@TimPietzcker-如果您检查后感到困惑,我还原了
A-Za-z
更改以显示与原始正则表达式的差异,然后在单独的编辑中提到了其他修复。