-1

以下是我的代码:

my $string1 = '<td><a href="http://www.aaa.com/downloads/details.aspx?FamilyID=a1b2c3">abcdefg</a><br />(123456)</td>';
my $string2 = 'http://www.aaa.com/downloads/details.aspx?FamilyID=a1b2c3';


print "Before string substitution:\n$string1\n";
$string1 =~ s/$string2//;
print "After string substitution:\n$string1\n"; 

和实际输出:

Before string substitution:
<td><a href="http://www.aaa.com/downloads/details.aspx?FamilyID=a1b2c3">abcdefg</a><br />(123456)</td>
After string substitution:
<td><a href="http://www.aaa.com/downloads/details.aspx?FamilyID=a1b2c3">abcdefg</a><br />(123456)</td> 

我的期望:

Before string substitution:
<td><a href="http://www.aaa.com/downloads/details.aspx?FamilyID=a1b2c3">abcdefg</a><br />(123456)</td>
After string substitution:
<td><a href="">abcdefg</a><br />(123456)</td> 

有人可以告诉我我的代码有什么问题吗?

谢谢。

4

2 回答 2

2

这个问题可以通过在脚本中添加两个字符来解决。您需要的是转义元字符$string2

$string1 =~ s/\Q$string2//;

导致匹配失败的字符是问号?,这里未转义的...aspx?...意思是“匹配字符'x'的0或1”。这些字符.是匹配除换行符之外的任何内容的通配符,这可能会导致误报匹配。斜线/虽然是元字符,因为它是替换运算符的分隔符s///,但不需要转义,因为它们嵌入在字符串中。

转义元字符最容易使用\Q ... \E转义序列、在正则表达式中或使用quotemeta.

尝试手动转义这些类型的字符串并不是一个好主意,尤其是在只需要文字匹配的情况下。

于 2013-03-13T03:59:51.203 回答
1

由于您要输入被 perl 正则表达式视为特殊字符的字符,因此您必须像这样将它们转义:

my $string2 = 'http:\/\/www\.aaa\.com\/downloads\/details\.aspx\?FamilyID=a1b2c3';

然后,当您运行程序时,将显示预期的输出:

<td><a href="http://www.aaa.com/downloads/details.aspx?FamilyID=a1b2c3">abcdefg</a><br />(123456)</td>
After string substitution:
<td><a href="">abcdefg</a><br />(123456)</td>

要从字符串中转义这些字符,最好只使用 perl 的quotemeta函数:

my $string2 = quotemeta('http://www.aaa.com/downloads/details.aspx?FamilyID=a1b2c3');

这将为您转义特殊字符,然后您的正则表达式替换将正常工作。

编辑

由于您因非转义的正则表达式字符而遇到问题,因此此解决方案可能更简单,因为它不需要您转义任何字符:

substr($string1, index($string1,$string2), length($string2)) = '';

这是基于此示例:

my $name = 'fred';
substr($name, 4) = 'dy'; # $name is now 'freddy'

在 perldocs 中找到substr

于 2013-03-13T03:49:29.643 回答