my $line = "buildroot+platfs2g@final.x86_64";
my $regex = "buildroot+platfs2g@final.x86_64";
if ($line =~ m/^$regex$/) {
print "matched\n";
} else {
print "not matched\n";
}
尽管$line
和$regex
是相同的字符串,但正则表达式不匹配
如果我从两个字符串中删除+
,它们就会匹配
如何让这两个字符串与其中的+
匹配?
答案 0 :(得分:3)
问题是+
是正则表达式中的元字符。
因此,您的模式是"阅读" t+
as"'''''不像你想要的那样。
有两个解决方案:
quotemeta
将转义任何元搜索(+
)my $regex = quotemeta "buildroot+platfs2g@final.x86_64";
\Q
和\E
引用您的正则表达式。 if ($line =~ m/^\Q$regex\E$/) {
if ( $line eq $regex ) {
会做到这一点。 (但重命名为$regex
,因为它会让人感到困惑)。 答案 1 :(得分:2)
这里有一些问题。
您可以通过转义正则表达式中的+
来解决您注意到的问题 - 因为它是一个元字符并且在正则表达式中具有特殊含义。有几种方法可以逃脱元字符 - 最简单的方法是在它前面放置一个\
。
你的正则表达式中还有一个.
。这是另一个元字符。你也需要逃避它。
然后,您的字符串不包含您认为包含的内容。变量在双引号字符串中展开,因此当Perl在双引号字符串中看到@final
时,它会查找具有该名称的数组以在该点处插入。此代码在编译use strict
时无法编译。您可以以相同的方式转义@
,但将双引号字符串更改为单引号字符串可能更有意义(因为变量不会在单引号字符串中展开)。< / p>
#!/usr/bin/perl
# Always use these.
use strict;
use warnings;
# Single-quote strings that don't need double-quotes
my $line = 'buildroot+platfs2g@final.x86_64';
# Escape metacharacters in regexes
my $regex = 'buildroot\+platfs2g@final\.x86_64';
if ($line =~ m/^$regex$/) {
print "matched\n";
} else {
print "not matched\n";
}
当然,如果你匹配两个应该完全相同的字符串,那么正则表达式是错误的工具。最好只使用eq
。