【问题标题】:regular expressions escaping rules- Perl-compatible regular expressions正则表达式转义规则 - Perl 兼容的正则表达式
【发布时间】:2014-07-30 21:13:38
【问题描述】:

为什么在下面的代码中,为了匹配字符串,我们必须用两个反斜杠而不是一个反斜杠来转义“$”?

<?php
$text = "$3.99";
preg_match_all("/\\$\d+\.\d{2}/", $text, $matches) ;
var_dump($matches) ;
?>

output: array (size=1)
  0 => 
    array (size=1)
      0 => string '$3.99' (length=5)

模式的匹配规则是什么:“/\$\d+.\d{2}/”(一个反斜杠)

【问题讨论】:

    标签: php regex escaping


    【解决方案1】:

    http://php.net/manual/en/language.types.string.php

    来自文档

    如果字符串用双引号 (") 括起来,PHP 将为特殊字符解释更多的转义序列:

    然后

    \\  backslash
    \$  dollar sign
    

    所以双反斜杠是用于字符串而不是正则表达式

    单个反斜杠会产生 $ 文字,然后将其传递给正则表达式

    【讨论】:

    • 你能给我一个匹配的例子吗:preg_match("/\$\d+\.\d{2}/" , "______")
    • 我明白你在说什么。 $ 是正则表达式中的一个特殊字符,所以如果我写 "/\$/" 它将意味着 /$/ 。但是如果 $ 特殊字符写在那里而不是在模式的末尾,它会做什么?你能找到一个与我上面评论中的模式相匹配的主题吗?
    • 表示匹配字符串的结尾,然后匹配后面的一些东西。哪个行不通。切换到单个字符串或转义反斜杠。它是真正导致问题的反斜杠
    【解决方案2】:

    我认为 php 有一些描述正则表达式字符串的选项。
    在第一层,他们似乎想要某种字符串,因为
    他们没有像 Perl 这样的运算符那样的引号,至少我不这么认为。

    第 2 级,他们继续使用正则表达式分隔符(远离双引号作为分隔符)。

    第 3 级,在 1 和 2 完成后,原始的正则表达式是裸露的。

    因此,通常,您将过程 3 - 2 -1 反转,并将其呈现给 php 源代码。

    注意 - 正则表达式分隔符是一项棘手的工作。在第 2 级中,您可能会
    选择一个在正则表达式中不可转义的分隔符。在你的情况下'$'会
    不是一个可行的分隔符。

    一些可能性可能会帮助你......

    \$\d+\.\d{2}                 # raw regex
    
    /\$\d+\.\d{2}/               # no quote, using '/' for delimeter
    '/\$\d+\.\d{2}/'             # single quotes        ""
    "/\\$\\d+\\.\\d{2}/"         # double quotes        ""
    
    ~\$\d+\.\d{2}~                # no quote, using '~' for delimeter
    '~\$\d+\.\d{2}~'              # single quotes        ""
    "~\\$\\d+\\.\\d{2}~"          # double quotes        ""
    

    【讨论】:

      猜你喜欢
      • 2013-01-18
      • 1970-01-01
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      相关资源
      最近更新 更多