我想知道這兩個正則表達式之間有什麼區別,什麼是親和騙局。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