转义Perl正则表达式中的特殊字符

时间:2011-09-14 21:22:52

标签: regex perl escaping pattern-matching

我正在尝试匹配Perl中的正则表达式。我的代码如下所示:

my $source = "Hello_[version]; Goodbye_[version]";
my $pattern = "Hello_[version]";
if ($source =~ m/$pattern/) {
  print "Match found!"
}

当Perl尝试匹配正则表达式时,括号表示一个字符类(或者我读过),并且匹配最终失败。我知道我可以使用\[\]转义括号,但这需要另一个代码块来遍历字符串并搜索括号。是否可以自动忽略括号而不单独转义它们?

快速注意:我不能只添加反斜杠,因为这只是一个例子。在我的真实代码中,$source$pattern都来自Perl代码之外(URIEncoded或来自文件)。

5 个答案:

答案 0 :(得分:12)

\Q将停用元字符,直到找到\E或模式结束。

my $source = "Hello_[version]; Goodbye_[version]";
my $pattern = "Hello_[version]";
if ($source =~ m/\Q$pattern/) {
  print "Match found!"
}

http://www.anaesthetist.com/mnm/perl/Findex.htm

答案 1 :(得分:11)

使用quotemeta()

my $source = "Hello_[version]; Goodbye_[version]";
my $pattern = quotemeta("Hello_[version]");
if ($source =~ m/$pattern/) {
  print "Match found!"
}

答案 2 :(得分:10)

你正在使用错误的工具。

你没有模式!没有正则表达式 $ pattern中的字符!

你有一个文字字符串。

index()用于处理文字字符串......

my $source = "Hello_[version]; Goodbye_[version]";
my $pattern = "Hello_[version]";
if ( index($source, $pattern) != -1 ) {
    print "Match found!";
}

答案 3 :(得分:0)

您可以使用以下命令转义表达式中的特殊字符集。

expression1 ='带有特殊字符的文字,例如$%()';

expression1 = ~s / [\?* + \ ^ \ $ [] \(){} \ | - ] /“\ $&”/ eg;

这将转义所有特殊字符

print“expression1”;#text包含特殊字符,例如\ $ \%()

答案 4 :(得分:-1)

引用$pattern会破坏正则表达式的目的,除非它被用作已知的文字并被转储到真正的正则表达式中。

修改
否则,只需使用index()来查找子字符串的位置。有了这些信息,只需使用substr()在必要时提取周围的数据。