23

好的正则表达式问题,如何在两个字符之间提取一个字符,在这种情况下是括号。

我有一个字符串,例如: word1 | {word2 | word3 } | 字 4

我只想得到第一个和最后一个“管道”,而不是括号之间的第二个。我已经尝试了无数次负克拉和负分组的尝试,但似乎无法让它发挥作用。

基本上,我在 JavaScript 拆分函数中使用此正则表达式将其拆分为包含:“word1”、“{word2 | word3}”、“word4”的数组。

任何帮助将不胜感激!

4

2 回答 2

33

在设置为 JavaScript 的refiddle.com上,尝试使用此模式

/\|(?![^{]*})/g

与此文本

word1 | {word2 | word3 } | word 4 | word 4 | {word2 | word3 }

这应该匹配所有不在 {} 内的管道符号。

于 2013-10-16T22:26:18.483 回答
21

取决于您使用的语言/实现,但是......

\|(?![^{]*})

这匹配一个跟随a 的管道,}除非 a{先出现。


(?! ... )被称为负前瞻断言如果我们从一个积极的前瞻断言开始,这更容易理解:

\|(?=[^{]*})

上面只匹配一个后面跟着 a}而没有遇到{第一个的管道。当您通过替换=a来否定它时!,匹配现在只有在没有办法让肯定情况为真(也称为补码)时才成功。

于 2013-10-16T21:49:25.740 回答