OK regex问题,如何提取两个字符之间的NOT字符,在本例中为括号。我有一串诸如:字1| {字2|字3}|字4我只想得到第一个和最后一个“管道”,而不是括号之间的第二个。我已经尝试了无数次负克拉和负分组的尝试,似乎不能让它工作。基本上,我在JavaScript split函数中使用这个正则表达式将其拆分为包含以下内容的数组:“单词1”,“{单词2|第3个字}""、第4个字””。如有任何帮助,我们将不胜感激!
zte4gxcn1#
尝试使用此模式
/\|(?![^{]*})/g
使用此文本
word1 | {word2 | word3 } | word 4 | word 4 | {word2 | word3 }
这应该与不在{}内的所有管道符号匹配。
tpgth1q72#
取决于您使用的语言/实现,但是...
\|(?![^{]*})
这与 not 后跟}的管道匹配,但{在前的情况除外。(?! ... )被称为 * 负前瞻Assert *。如果我们从 * 正 * 前瞻Assert开始,这会更容易理解:
}
{
(?! ... )
\|(?=[^{]*})
上面的例子只匹配一个 is 后面跟着}的管道,而没有先遇到{。当你用!替换=来否定它时,现在只有 * 当肯定的情况不可能 * 为真(也称为 * 补码 *)时,匹配才成功。
!
=
2条答案
按热度按时间zte4gxcn1#
尝试使用此模式
使用此文本
这应该与不在{}内的所有管道符号匹配。
tpgth1q72#
取决于您使用的语言/实现,但是...
这与 not 后跟
}
的管道匹配,但{
在前的情况除外。(?! ... )
被称为 * 负前瞻Assert *。如果我们从 * 正 * 前瞻Assert开始,这会更容易理解:上面的例子只匹配一个 is 后面跟着
}
的管道,而没有先遇到{
。当你用!
替换=
来否定它时,现在只有 * 当肯定的情况不可能 * 为真(也称为 * 补码 *)时,匹配才成功。