这两个正则表达式有什么区别?(使用php preg_match())
/^[0-9\x{06F0}-\x{06F9}]{1,}$/u
/^[0-9\x{06F0}-\x{06F9}\x]{1,}$/u
\x
第二种模式中的最后一个是什么意思?
它被解释为\x00
(空字符),但几乎可以肯定它是由草率的编辑或复制和粘贴引起的错误。
http://www.regular-expressions.info/unicode.html
...因为 \x 本身不是有效的正则表达式令牌...
我认为第二种模式无效。
根据此页面http://www.regular-expressions.info/unicode.html, \x 仅在后跟 unicode 编号有用:
由于 \x 本身不是一个有效的正则表达式标记,\x{1234} 永远不会被混淆为匹配 \x 1234 次。
这很奇怪。unicode 字符的 PHP 表示法是 \x{}。在 perl 中,它是同样的事情。
但是 php 在正则表达式中有 //u 修饰符。我认为这意味着unicode。perl 中没有这样的修饰符。
在 perl 正则表达式中,\x## 被解析,其中 ## 需要表示一个 ascii 字符。如果它的 \x 或 \x#,它的非法十六进制数字被忽略的警告(因为它需要 2 个数字,不多不少)并且它只需要序列中的有效十六进制数字。如果您没有 \x 中的数字,则它使用 \0 ascii char 等。
但是,任何 \x{} 表示法都可以,并且 \x{0} 等价于 \x{}。并且 \x{0}-\x{ff} 被认为是 ascii,\x{100}- 被认为是 unicode。
因此,\x 是一个有效的十六进制/unicode 转义序列,但它本身是假定的十六进制并且不完整,可能不应该留给解析器默认机制。
据我所知,第二个\x
实际上是一个无效字符。两种表达方式都有效吗?