这两个正则表达式之间的区别?

时间:2012-05-06 17:17:40

标签: php regex pcre

这两个正则表达式之间有什么区别?(使用php preg_match())

/^[0-9\x{06F0}-\x{06F9}]{1,}$/u

/^[0-9\x{06F0}-\x{06F9}\x]{1,}$/u

第二种模式中最后\x的含义是什么?

5 个答案:

答案 0 :(得分:4)

它被解释为\x00(空字符),但几乎可以肯定是由于草率编辑或复制和粘贴而导致的错误。

答案 1 :(得分:1)

http://www.regular-expressions.info/unicode.html

  

...因为\ x本身不是有效的正则表达式令牌......

答案 2 :(得分:0)

我认为第二种模式无效。

根据此页面http://www.regular-expressions.info/unicode.html,\ x仅用于后跟unicode编号:

  

由于\ x本身不是有效的正则表达式标记,因此\ x {1234}永远不会   困惑地匹配\ x 1234次。

答案 3 :(得分:0)

这很奇怪。 unicode字符的Php表示法是\ x {}。在perl中,它是一回事。

但是php在正则表达式中有// u修饰符。我认为这意味着unicode。 perl中没有这样的修饰符。

在perl regex中,\ x ##被解析,其中##表示ascii字符。如果它是\ x或\ x#,则忽略非法十六进制数字的警告(因为它需要2位数,不多不少)并且它只接受序列中的有效十六进制数字。如果你没有\ x中的数字,它使用\ 0 ascii char等..

但是,任何\ x {}符号都可以,\ x {0}等同于\ x {}。并且\ x {0} - \ x {ff}被视为ascii,\ x {100} - 被视为unicode。

因此,\ x是一个有效的十六进制/ unicode转义序列,但它本身是asumed十六进制并且是不完整的,可能不应该留给解析器默认机制。

答案 4 :(得分:0)

据我所知,第二个\x实际上是一个无效字符。两个表达都有用吗?