为什么这个正则表达式在perl中没有评估为true?

时间:2013-06-04 19:54:22

标签: regex perl

我用单引号包装我的第一个内容字符串,以简化我的要求。它没有包含在我的代码中。

'{
#    "ERROR" : [
#       "generic error message"
#    ]
# }' =~ {

看起来这应该是真的,因为我只是检查一个开括号的第一个表达式,但它的评估为false。

2 个答案:

答案 0 :(得分:3)

在像PHP这样的语言中,正则表达式只是一个普通的字符串,带有引号:"/regex/"。另一方面,Perl具有正则表达式文字。它们直接嵌入到代码中,但仍然需要分隔符。

一般来说,这看起来像:

$string =~ /regex/

斜杠是默认分隔符。如果斜杠是一个不方便的分隔符,你可以选择任何其他(1) -just前缀正则表达式m(匹配)。这些匹配是等效的:

$url =~ /http:\/\///;
$url =~ m/http:\/\///;
$url =~ m{http://};

如果要将预编译的正则表达式存储在变量中,可以使用qr//引号。更喜欢这些字符串,因为qr//正则表达式遵循与正则表达式相同的引用规则(没有双重转义):

my $url_regex = qr~http://~;
$url =~ $url_regex;

=~绑定运算符会尽力将右手参数解释为正则表达式,因此您甚至可以以类似于php的方式使用字符串:

"123\nab12" =~ "\\d\n\\w+"; # double escaping sucks, still matches

但这不如/\d\n\w+/

因此,无法跳过任何分隔符:

# "=~" has higher precedence than "+".
# Establishing precedence is the *sole* task of the parens here
"112" =~ (1+2); # fails
"3"   =~ (1+2); # matches
"112" =~ /1+2/; # matches

  1. 不要将问号用作正则表达式分隔符,这些只匹配一次。

答案 1 :(得分:2)

试试这个:

'your string' =~ /\{/

您的语法无效,如图所示,因为{不是正则表达式。为了解决这个问题,我将其包装在默认正则表达式字符中以获取/{/,然后转义{(导致/\{/),因为它是正则表达式语法的元字符。 (对于正则表达式x{a,b}表示x应至少重复a次,最多b次。)