String 简单的字符串替换不起作用

String 简单的字符串替换不起作用,string,perl,substitution,String,Perl,Substitution,以下是我的密码: 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

以下是我的密码:

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"; 
my$string1='
(123456)'; 我的$2http://www.aaa.com/downloads/details.aspx?FamilyID=a1b2c3'; 打印“字符串替换前:\n$string1\n”; $string1=~s/$string2/; 打印“字符串替换后:\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> 
字符串替换之前的

(123456) 字符串替换后:
(123456)
我所期望的是:

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> 
字符串替换之前的

(123456) 字符串替换后:
(123456)
有人能告诉我我的密码出了什么问题吗


谢谢

由于要输入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>
这将为您转义特殊字符,然后您的正则表达式替换将正常工作

编辑

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

substr($string1, index($string1,$string2), length($string2)) = '';
这是基于这个例子:

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

在的perldocs中找到。

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

$string1 =~ s/\Q$string2//;
导致匹配失败的字符是问号
,在这里它未被替换
…aspx?..
表示“匹配字符“x”的0或1”。字符
是与除换行符以外的任何字符匹配的通配符,这可能会导致误报匹配。斜杠
/
,虽然由于是替换运算符
s///
的分隔符而成为元字符,但不需要转义,因为它们嵌入到字符串中

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


手动尝试转义这些类型的字符串不是一个好主意,特别是如果只需要文本匹配。

您的思路肯定是对的;主要的故障制造者是
;在这种情况下,斜杠实际上不是问题(只在
前面加一个反斜杠,然后再试一次)。
字符与
匹配非常愉快(以及其他任何字符)。事实上,字符串不太可能因为点而引起问题。@JonathanLeffler,明白了。谢谢你的澄清!:)您的示例几乎应该是
{my$index=index($string1,$string2);if($index>=$[){substr($string1,$index,length($string2),“”)}
。如果不匹配,您现在拥有的内容会将空字符串附加到
$string1
的末尾。现在这不是什么大问题,但将来当字符串成为默认值时,它可能会导致不必要的复制。HTML和regex是一个致命的吸引力。@MkV您的意思是上瘾吗?
是唯一阻止它的字符rom匹配。这两个
也可能会变得很麻烦。@BradGilbert我不确定你的评论是什么。如果你只修复了
,它仍然可以匹配
http://www_aaa.com/downloads/details.aspx?FamilyID=a1b2c3
(将第一个
替换为
)。这将使第一个
成为一个问题。(该评论主要是针对这个答案的未来观众)@brad我提出的解决方案不会给元字符带来问题。我知道不会。如果有类似问题的人只是反斜杠了
,他们仍然可能有问题。这是一个更难找到的问题。我想应该有一些东西指出,使用
quotemeta
\Q…\E
将解决其他尚不明显的问题。
$string1 =~ s/\Q$string2//;