2012-02-15 101 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 - 無論語言),因爲這正則表達式是包裹着()