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

7
我正在尝试在Perl中匹配一个正则表达式。我的代码如下所示:
my $source = "Hello_[version]; Goodbye_[version]";
my $pattern = "Hello_[version]";
if ($source =~ m/$pattern/) {
  print "Match found!"
}

问题在于当Perl尝试匹配正则表达式时,括号表示字符类(或者我这样读),从而导致匹配失败。我知道可以使用\[\]转义括号,但这需要通过另一个代码块来搜索字符串中的括号。是否有一种方法可以自动忽略括号而不需要逐个转义它们?
快速提示:我不能只添加反斜杠,因为这只是一个示例。在我的真实代码中,$source$pattern都来自Perl代码外部(可能是URIEncoded或来自文件)。
4个回答

14

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

\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
我改变了我的“已接受的答案”,很抱歉,虽然你的方法也可以,但我认为index()才是我真正需要的。还是谢谢你! - CoV

13

使用quotemeta()函数:

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

12

你使用的工具不正确。

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

你有一个字面字符串。

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

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

“regex字符”到底是什么?我认为正则表达式只是一种在字符串中匹配字符串或模式的手段,它不是特定的字符集,除非还有我不知道的其他含义?谢谢你提供index()方法。明天我到服务器上试试;我确实认为index()方法比正则匹配更好用、更干净。 - CoV
"regex character" 是一个打字错误,我想写的是 "regex 元字符"。 - tadmc
在搜索$source中带有@符号的字符串时无法工作。 - that-ben

0

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

expression1 = 'text with special characters like $ % ( )';

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

#This will escape all the special characters
print "expression1'; # text with special characters like \$ \% \( \)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接