2012-02-15 65 views
0

我想知道这两个正则表达式之间有什么区别,什么是亲和骗局。PHP的正则表达式差异

示例输入(日期)31-12-2012。

Method A: 
/(\d{2}-\d{2}-\d{4})/ 

和:

Method B: 
^[0-9]{2}[-/][0-9]{2}[-/][0-9]{4}\$ 
+0

这是功课? – 2012-02-15 12:13:26

+1

你是否仅在'\ d'与'[0-9]'之后的区别?因为(2)中的起始'^'将它锚定在开始处(1中没有这种东西,任何文本中某处的日期都会匹配),而结尾的'\ $',意思是'$'而不是行尾(删除\以获得)。对我来说非常重要...另外,捕获('()')与非捕获,固定'-'分隔符或者'-'和'/'识别为分隔符....很多差异。 – Wrikken 2012-02-15 12:25:45

+0

B最好是'/ [0-9] {2} - [0-9] {2} - [0-9] {4} /'以符合要求。 – powtac 2012-02-15 12:26:34

回答

2
  1. 第一个有分隔符/,第二个没有。目前,我认为这是一个复制/粘贴问题。
  2. B强制将日期作为字符串中的第一项出现,^,A仅与"a datestring anyw00-00-0000where in the string"一致。
  3. A通过额外的()捕获比赛1中的日期,B没有这样的事情。由于整场比赛将是比赛中的0这一项,您可能会丢失不需要的()
  4. \d vs [0-9]→见Avner's answer
  5. A仅匹配-作为日/月/年分隔符。如果您只希望使用-。如果您期望BOTH - AND /,请使用[-/],如B中所示。
  6. B要在$的日期结束,A不。使用适用的那个。如果我假设这是一个复制/粘贴错误($由于没有很好的理由而在双引号字符串中被转义),它使得B匹配只有一个日期,因为锚定的日期字符串为^regex$,输入。再次使用适用于您的数据的选项。
  7. 它们都不验证日期。只有格式看起来像一个,但可能不是一个。
2

方法B将接受斜线以及用于分隔符破折号。否则,它们是相同的。

而且,要知道,方法B将接受:

31/12-201231-12/2012

我能想到的唯一的con是,方法B将占用更多的磁盘空间,因为它是一个更长的字符串。

+0

_否则,它们是相同的=真的?额外超级确定真的吗? – Wrikken 2012-02-15 12:41:57

2

\ d与[0-9]几乎完全相同。我可以想象[0-9]涉及更多的解析,但这是微不足道的。

那么剩下的唯一的区别是,方法B也解析:

31/12/2012

2

理论上,\d应该抓住的不仅仅是[0-9]。它理论上也应该[0-9](阿拉伯数字)以及Unicode标准包含为“数字”的任何其他数字格式。 这可能包括古希腊和罗马数字,计数棒,东亚字符,无理数和十六进制数字。 Really

在实践中,我认为大多数正则表达式解析器不能正确处理这些问题,从我测试的几个在线正则表达式工具中得到。

1

方法A将有反向参考1(或$ 1,或\ 1 - 无论语言),因为这正则表达式是包裹着()