正则表达式转义规则——perl兼容的正则表达式


regular expressions escaping rules- Perl-compatible regular expressions

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

<?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}/"(一个反斜杠)

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

从docs

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

然后

''  backslash
'$  dollar sign

双反斜杠表示字符串而不是正则表达式

一个反斜杠会产生$ literal,然后传递给正则表达式

我认为php有几个选项来描绘正则字符串。
在第一层,它们似乎想要某种类型的字符串,因为
它们不像Perl那样有引号运算符,至少我不这么认为。

第2级,它们移动到regex分隔符(避免双引号作为分隔符)。

Level 3,原始正则表达式在1 &2个完成了。

通常情况下,你把3 - 2 -1的过程颠倒过来,然后把它呈现给php源代码。

注意- Regex分隔符是一件棘手的事情。在第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        ""