我想知道这两个正则表达式之间有什么区别,什么是亲和骗局。PHP的正则表达式差异
示例输入(日期)31-12-2012。
Method A:
/(\d{2}-\d{2}-\d{4})/
和:
Method B:
^[0-9]{2}[-/][0-9]{2}[-/][0-9]{4}\$
我想知道这两个正则表达式之间有什么区别,什么是亲和骗局。PHP的正则表达式差异
示例输入(日期)31-12-2012。
Method A:
/(\d{2}-\d{2}-\d{4})/
和:
Method B:
^[0-9]{2}[-/][0-9]{2}[-/][0-9]{4}\$
/
,第二个没有。目前,我认为这是一个复制/粘贴问题。^
,A仅与"a datestring anyw00-00-0000where in the string"
一致。()
捕获比赛1中的日期,B没有这样的事情。由于整场比赛将是比赛中的0
这一项,您可能会丢失不需要的()
。\d
vs [0-9]
→见Avner's answer。-
作为日/月/年分隔符。如果您只希望使用-
。如果您期望BOTH -
AND /
,请使用[-/]
,如B中所示。$
的日期结束,A不。使用适用的那个。如果我假设这是一个复制/粘贴错误($
由于没有很好的理由而在双引号字符串中被转义),它使得B匹配只有一个日期,因为锚定的日期字符串为^regex$
,输入。再次使用适用于您的数据的选项。方法B将接受斜线以及用于分隔符破折号。否则,它们是相同的。
而且,要知道,方法B将接受:
31/12-2012
或31-12/2012
我能想到的唯一的con是,方法B将占用更多的磁盘空间,因为它是一个更长的字符串。
_否则,它们是相同的=真的?额外超级确定真的吗? – Wrikken 2012-02-15 12:41:57
\ d与[0-9]几乎完全相同。我可以想象[0-9]涉及更多的解析,但这是微不足道的。
那么剩下的唯一的区别是,方法B也解析:
31/12/2012
理论上,\d
应该抓住的不仅仅是[0-9]。它理论上也应该[0-9](阿拉伯数字)以及Unicode标准包含为“数字”的任何其他数字格式。 这可能包括古希腊和罗马数字,计数棒,东亚字符,无理数和十六进制数字。 Really。
在实践中,我认为大多数正则表达式解析器不能正确处理这些问题,从我测试的几个在线正则表达式工具中得到。
方法A将有反向参考1(或$ 1,或\ 1 - 无论语言),因为这正则表达式是包裹着()
这是功课? – 2012-02-15 12:13:26
你是否仅在'\ d'与'[0-9]'之后的区别?因为(2)中的起始'^'将它锚定在开始处(1中没有这种东西,任何文本中某处的日期都会匹配),而结尾的'\ $',意思是'$'而不是行尾(删除\以获得)。对我来说非常重要...另外,捕获('()')与非捕获,固定'-'分隔符或者'-'和'/'识别为分隔符....很多差异。 – Wrikken 2012-02-15 12:25:45
B最好是'/ [0-9] {2} - [0-9] {2} - [0-9] {4} /'以符合要求。 – powtac 2012-02-15 12:26:34