Regex 使用带有特殊字符的变量替换perl正则表达式
好的,我已经检查了以前类似的问题,我一直在处理quotemeta的不同变体,但有些地方仍然不正确 我有一行字ID和两个字-第一个是错误的字,第二个是正确的。 我用正则表达式把错误的词替换成正确的词Regex 使用带有特殊字符的变量替换perl正则表达式,regex,perl,special-characters,Regex,Perl,Special Characters,好的,我已经检查了以前类似的问题,我一直在处理quotemeta的不同变体,但有些地方仍然不正确 我有一行字ID和两个字-第一个是错误的字,第二个是正确的。 我用正则表达式把错误的词替换成正确的词 $line = "ANN20021015_0104_XML_16_21 A$xAS A$xASA"; @splits = split("\t",$line); $wrong_word = quotemeta $splits[1]; $right_word = quotemeta $splits[2
$line = "ANN20021015_0104_XML_16_21 A$xAS A$xASA";
@splits = split("\t",$line);
$wrong_word = quotemeta $splits[1];
$right_word = quotemeta $splits[2];
print $right_word."\n";
print $wrong_word."\n";
$line =~ s/$wrong_word\t/$right_word\t/g;
print $line;
我在做什么
编辑
问题是我无法保留完整的单词-它们在特殊字符处被切掉。这段代码对于没有特殊字符的单词非常有效
以上示例所需的输出为:
ANN20021015_0104_XML_16_21 A$xASA A$xASA
但我得到的是
ANN20021015_0104_XML_16_21 A A
因为$
字符。ETA:
自从你得到:
ANN20021015_0104_XML_16_21 A A
当您需要时:
ANN20021015_0104_XML_16_21 A$xASA A$xASA
我的怀疑如下:
- 您不是有意插入变量
和$xAS
,因此,由于它们未定义,它们只是将空字符串添加到输出中可见的$xASA
。例如,$line
扩展为“A$xAS”
“A”。取消定义
- 您没有使用
,因此无法获取有关此错误的信息使用警告
严格使用;使用警告代码>。总是它们为你节省了很多时间
赋值时,请使用单引号,以避免插入变量:
$line = 'ANN20021015_0104_XML_16_21 A$xAS A$xASA';
旧答案:
既然你没有说什么地方出了问题,那只是我这边的猜测
我可以看到变量$xAS
和$xASA
可能意外插入,您可以通过转义美元符号或在$line
赋值上使用单引号来解决
您还可以使用join
而不是正则表达式来构建新字符串,例如:
$line = join "\t", @splits[0,2,2];
问题不在于你的替代;问题就在代码示例的第一行
$line = "ANN20021015_0104_XML_16_21 A$xAS A$xASA";
尝试将变量$xAS
和$xASA
插入$line
,但不插入任何内容,因为这些变量为空。使用单引号而不是双引号,这样字符串就不会插值
如果您打开了警告
,它会警告您正在插入未初始化的变量,如果您打开了严格的“vars”
,它就不会允许您使用未声明的$xAS
和$xASA
最后,您不必quotemeta
替换的右侧;只有左边。
- 如果您使用了
strict
,它会告诉您必须声明变量$xAS
和$xASA
李>
- 如果您使用了
警告
,它会告诉您连接的是一个未初始化的变量李>
因此有一条常见的警告:“严格使用,警告使用”
您只需将字符串放入('
,q{}
)或转义sigil($
),这样它就不会尝试将它认为是变量的内容
“
是会弄乱字符串的引号
“
是不会
课程:除非需要插值,否则请使用单引号 你有什么迹象表明你所做的事情有问题?给出错误、预期输出和实际输出。是要插入到$line
中的$xAS
和$xASA
变量吗?否则,第一行需要用单引号括起来!它们实际上是在插值两个变量,$xAS
和$xASA
,而不是$x
。仅在需要插值时使用双引号。:)