正则表达式 - 即使正则表达式匹配正确,替换也不会替换

时间:2015-04-22 00:02:02

标签: regex perl

尝试将[[http://someUrl.com][link]]替换为<a href="http://someUrl.com">link</a>

正则表达式匹配正确,我可以正确看到$ 1,$ 2,$ 3设置。

http://refiddle.com/292g

$1:[[http://someUrl.com][link]] $2:http://someUrl.com $3:link

foreach my $pText("line1 [[http://google.com][google]] end","line2 [[http://someUrl.com][link]] end"){
        my $pTemp = $pText;
        print "\n".$pTemp."\n";
        if ($pTemp =~ /(\[\[((?:http|https|ftp|file|gopher|irc|news|mailto|nntp|telnet)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(?::[a-zA-Z0-9]*)?\/?[a-zA-Z0-9\-\._\?\,\'\/\\\+&amp;%\$#\=~]*)\]\[(.*?)\]\])/){
            print "MATCHED  : $1 >> $2 >> $3\n";
            #$pTemp =~ s/$1/<a href="$2">$3<\/a\>/;
            $pTemp =~ s/$1/NEED TO REPLACE/;
            print "MODIFIED : $pTemp\n\n";
        }
    }

奇怪的是它会导致

line1 [[http://google.com][google]] end
MATCHED  : [[http://google.com][google]] >> http://google.com >> google
MODIFIED : line1 [[http://google.com][googNEED TO REPLACE] end


line2 [[http://someUrl.com][link]] end
MATCHED  : [[http://someUrl.com][link]] >> http://someUrl.com >> link
MODIFIED : line2 [[http://someUrl.com][link]] end

即使正则表达式正确匹配字符串,我也不确定为什么替换失败。 任何指针都会有很大的帮助。

1 个答案:

答案 0 :(得分:1)

s//的第一个参数被解释为正则表达式,因此匹配中的“[”和“]”字符会搞砸。您可以使用'\ Q'来逃避它们:

$pTemp =~ s/\Q$1/NEED TO REPLACE/;