如何将字符串转换为在Perl中与自身匹配的正则表达式?

时间:2009-10-21 19:27:42

标签: regex perl

如何将字符串转换为在Perl中与自身匹配的正则表达式?

我有一组这样的字符串:

Enter your selection:
Enter Code (Navigate, Abandon, Copy, Exit, ?):

我希望将它们转换为正则表达式,我可以匹配其他内容。在大多数情况下,字符串与正则表达式相同,但在上面的第二个示例中没有,因为(和?在正则表达式中有意义。因此第二个字符串需要变成如下表达式:

Enter Code \(Navigate, Abandon, Copy, Exit, \?\):

我不需要匹配太严格,所以像这样的东西就可以了:

Enter Code .Navigate, Abandon, Copy, Exit, ..:

我目前的想法是我可以使用类似的东西:

s/[\?\(\)]/./g;

但我真的不知道字符串列表中会有哪些字符,如果我错过了一个特殊的字符,那么我可能永远不会注意到该程序没有按预期运行。我觉得应该有一个普遍的解决方案。

感谢。

5 个答案:

答案 0 :(得分:18)

正如Brad Gilbert评论使用quotemeta

my $regex = qr/^\Q$string\E$/;

my $quoted = quotemeta $string;
my $regex2 = qr/^$quoted$/;

答案 1 :(得分:7)

quotemeta有一个功能。

  

quotemeta EXPR
  返回EXPR的值   所有非“单词”字符   反斜杠。 (也就是说,所有人物   不匹配/[A-Za-z_0-9]/将是   之前是反斜杠   返回字符串,无论如何   区域设置。)这是内部的   实现\Q转义的函数   双引号字符串。

     

如果省略EXPR,请使用$_

答案 2 :(得分:3)

来自http://www.regular-expressions.info/characters.html

有11个具有特殊含义的字符:左方括号[,反斜杠\,插入符^,美元符号$,句点或点.,垂直条或竖线符号|,问号?,星号或星号*,加号+,开头圆括号(和结束圆括号)

在Perl(和PHP)中有一个特殊的函数quotemeta,它将为你逃避所有这些。

答案 3 :(得分:3)

要将Brad Gilbert的建议放入答案而不是评论中,您可以使用quotemeta功能。所有归功于他

答案 4 :(得分:3)

为什么要使用正则表达式?由于您没有进行任何捕获,似乎您不会允许任何变化,为什么不简单地使用index内置?

$s1 = 'hello, (world)?!';
$s2 = 'he said "hello, (world)?!" and nothing else.';

if ( -1 != index  $s2, $s1 ) {
    print "we've got a match\n";
}
else {
    print "sorry, no match.\n";
}