3

リテラル文字列が散らばっているファイルがあります。特定のマクロがラップされているものもあれば、ラップされていないものもあります。1 行に複数のリテラル文字列がある場合があります。それらの周りに特定のマクロのいずれかを持たないものをマクロで囲む正規表現をどのように書くのですか? まだラップできないマクロのセットは 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")

1つの正規表現で実行できるかどうかさえわかりませんが、実行できる人には追加のポイントがあります。;)

編集わかりましたので、ここに私が行った1つの試みがあります:

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")
4

1 に答える 1