2012-09-14 28 views
0

我需要在由\n分隔的一些句子中间添加一个字符串。 例如:perl正则表达式匹配一个字符串并在其旁边添加一个字符串

INPUT   OUTPUT 
V2+count -> V2+came+count 
V6+num  -> V6+came+num 
V10+hi+town -> V10+came+hi+town 

N2+hello -> N2+went+hello 
N7+time  -> N7+went+time 

我写了到目前为止的代码是

if ($new=~/\(came\)\|\(went\)/) { 
    my $prev_tag = $`; 
    if ($prev_tag5=~ /\(V\d+?\)?\+$/) { 
     $new=~ s/\(came\)\|//; 
    } else { 
     $new=~s/\(went\)\|//; 
    } 
} 
+0

所有的正则表达式包括文字括号,但是你提供的例子母鹿不包括任何括号,所以他们不会匹配你的任何正则表达式。 – pmakholm

+0

你应该如何选择在一个特定情况下添加'came'或'went'? – raina77ow

+0

数据**(1)**令牌分隔符中的“+”字符 - 事实上,您正在处理一系列字符串或**(2)**空格,您只是想强调它们,或者* *(3)**输入/输出中的文字加'+'字符?我有点困惑。 – amon

回答

4

我的建议是保持简单,不要试图在并行处理这两种情况。因此,通过增加开始“来”到所有匹配/V\d+/的情况下,然后添加“去”到所有的情况匹配/N\d+/

$new =~ s/(V\d+\+)/$1came+/; 
$new =~ s/(N\d+\+)/$1went+/; 
+0

尽管可读性较差,但可以使用'r'修饰符在一行上执行两个替换:'$ new = $ new =〜s /(V \ d + \ +)/ $ 1came +/r =〜s/(N \ d + \ +)/ $ 1went +/r;' – Kenosis

+0

更可读,但仍然是一行:'$ new =〜s /(V \ d + \ +)/ $ 1came + /; $ new =〜s /(N \ d + \ +)/ $ 1went + /;' – pmakholm

相关问题