-2

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

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

看起来这应该是正确的,因为我只是检查第一个表达式是否有左括号,但它的评估结果为假。

4

2 回答 2

3

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

一般来说,这看起来像:

$string =~ /regex/

斜杠是默认分隔符。如果斜杠是不方便的分隔符,您可以选择任何其他(1) — 只需在正则表达式前面加上m(for match)。这些匹配是等效的:

$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. 不要使用问号作为正则表达式分隔符,它们只匹配一次。
于 2013-06-04T22:13:56.463 回答
2

尝试这个:

'your string' =~ /\{/

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

于 2013-06-04T19:57:27.940 回答