我有一个文件需要浏览,其中散布着文字字符串。有些包裹着特定的宏,有些则没有。一行中可能有多个文字字符串。如何编写一个正则表达式,将一个宏放在那些周围没有特定宏之一的周围?无法包装的宏集超过 1 个,但数量有限(比如 3 个)。
因此,如果宏集是 FOO、BAR 和 BAZ,并且我想用 BAFF 包装所有其他未包装的文字字符串,我将拥有:
JBAZ ( "str \" " ) BAZ( " \" boo" ) BAR ("boo") hello(" jazz ") FOO("FUN")
会导致:
JBAZ (BAFF("str \" ")) BAZ( " \" boo" ) BAR ("boo") hello(BAFF(" jazz ")) FOO("FUN")
我什至不确定它是否可以在一个正则表达式中完成,但对于那些这样做的人来说是额外的。;)
编辑好的,这是我做过的一次尝试:
my $qs = q("(?:\\\\.|[^"])*")
# Read in characters until it hits a double quote and then check if string before
# it is not \bFOO, \bBAR or \bBAZ. Then read in quoted string and put BAFF()
# around it.
s/([^"]*)(?<!\bFOO)(?<!\bBAR)(?<!\bBAZ)[[:space:]](?<!\))*\($qs\))/$1BAFF($2)/g
# Doesn't work since it'll find an end quote or a quoted quote and match replace
# from there:
# JBAZ ( BAFF("str \" ") ) BAZ( BAFF(" \" boo") ) BAR ("booBAFF(") hello(") jazz BAFF(") FOO(")FUN")