如何在这个乳胶示例中使用lookaround正则表达式

时间:2014-05-25 06:11:52

标签: regex regex-lookarounds

乳胶样品如下:

  

$F=K$,balalalala,balablal Bi$_x$Sb$_{1-x}$,balabla $abcd$ balabala

我想要匹配的是内联数学表达式,如$F=K$$abcd$,而不是那些表达式为" _"在" $"之后,如$_x$$_{1-x}$

所以我写这样的正则表达式

\$[^_][^\$]+\$(?!_)

我添加了(?!_),因为$Sb$中间的Bi$_x$Sb$_{1-x}$不应被视为数学表达式。

但代码运行不正常。它返回两个表达式 $F=K$$,balabla $

这个问题的正确表达式是什么?

1 个答案:

答案 0 :(得分:0)

你想要的匹配需要一个Lookbehind正则表达式,比如:

\$[^$]+\$(?<!\$_[^$]+)

但是我们知道里面的正则表达式无法使用+*(必须是固定长度),因此上述正则表达式无效。

我建议在2遍中处理文本。在第一遍中删除任何$_xxx$模式:

perl -ne 's/(\$_[^\$]+\$)//g;print;'

然后匹配您想要的模式:

grep -oP '\$[^$]+\$'