如何将字符串转换为在Perl中与自身匹配的正则表达式?
我有一组这样的字符串:
Enter your selection:
Enter Code (Navigate, Abandon, Copy, Exit, ?):
我希望将它们转换为正则表达式,我可以匹配其他内容。在大多数情况下,字符串与正则表达式相同,但在上面的第二个示例中没有,因为(和?在正则表达式中有意义。因此第二个字符串需要变成如下表达式:
Enter Code \(Navigate, Abandon, Copy, Exit, \?\):
我不需要匹配太严格,所以像这样的东西就可以了:
Enter Code .Navigate, Abandon, Copy, Exit, ..:
我目前的想法是我可以使用类似的东西:
s/[\?\(\)]/./g;
但我真的不知道字符串列表中会有哪些字符,如果我错过了一个特殊的字符,那么我可能永远不会注意到该程序没有按预期运行。我觉得应该有一个普遍的解决方案。
感谢。
答案 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";
}