perl正则表达式与带有“+”字符的字符串匹配

时间:2018-01-08 09:11:29

标签: regex perl

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是相同的字符串,但正则表达式不匹配 如果我从两个字符串中删除+,它们就会匹配 如何让这两个字符串与其中的+匹配?

2 个答案:

答案 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