2012-02-15 10 views
0

私はこれらの2つの正規表現の違いが何であるか知りたいです。プロとコンスは何ですか?PHPの正規表現の違い

入力の例(日付)31-12-2012。

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

そして:

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

この宿題ですか? –

+1

あなたは '\ d'と' [0-9] 'の違いの後に_only_ですか? (2)で '^'を始めると、最初にアンカーされるので(1の中には何もないので、テキストのどこかの日付がマッチします)、行末ではなく文字 '$'を意味する終了 '\ $' (\を取り除く)。私にとって非常に重要な違いです...また、キャプチャ( '()')と非キャプチャ、固定 ''デリミタまたはデリミタとして認識される ' - 'と '/'の両方.... – Wrikken

+0

Bは、/ [0-9] {2} - [0-9] {2} - [0-9] {4}/'の方が望ましいでしょう。 – powtac

答えて

2
  1. 最初の区切り文字は/です。第2の区切り文字は区切り文字ではありません。今のところ、私はそれがコピー/ペーストの問題であると仮定します。
  2. Bは、^という文字列の最初の項目として日付を強制します.Aは"a datestring anyw00-00-0000where in the string"と一致します。
  3. Aはマッチ1の日付を余分に()でキャプチャしますが、Bはそのようなことを行いません。試合の全体が0番目のアイテムとなるため、不要な()が失われる可能性があります。
  4. \d[0-9]Avner's answerを参照してください。
  5. Aは、日/月/年の区切り文字として-にのみ一致します。 -が必要な場合に使用してください。 -/の両方が必要な場合は、Bと同様に[-/]を使用してください。
  6. Bは、日付が$で終わることを望んでいますが、Aではありません。適用されるものを使用してください。私は、これはコピー/ペーストエラー(それは正当な理由なく、二重引用符で囲まれた文字列であるため、$がエスケープされている)であると仮定した場合、それが理由^regex$固定するだけ日付をBマッチを行い、日付文字列のどこかで入力。もう一度、データに適用されるオプションを使用します。
  7. どちらも日付を検証しません。ちょうど1つのように見えるが、1つではないフォーマットでもよい。方法Aは、後方参照1持っている(または$ 1、または\ 1 - 言語が何であれ)になる
2

方法Bは、区切り文字のスラッシュだけでなく、ダッシュを受け入れます。そうでなければ、それらは同一です。

31/12-2012または31-12/2012

を私は考えることができる唯一の詐欺は、それが長い文字列であるため、方法Bは、より多くのディスクスペースを取るということです。

また、方法Bが受け入れることに注意してください。

+0

_それ以外は、same_ =>本当ですか?余分なスーパーは本当ですか? – Wrikken

2

\ dは[0-9]とほとんど同じです。私は、[0-9]のためには、より小さなパーシングが関与していると想像することができますが、これはごくわずかです。

そして、残っている唯一の違いは、方法Bも解析することである:

31/12/2012

2

を理論的には、\dはちょうど[0-9]以上のものをキャッチする必要があります。それは理論的に[0-9](アラビア数字)と、Unicode標準が "数字"として含む他の数値形式をキャッチする必要があります。 これには、古代ギリシャ語とローマ数字、棒数、東アジア文字、不合理な数字、および16進数が含まれます。 Really

実際には、ほとんどの正規表現パーサーは、私がテストしたいくつかのオンライン正規表現ツールからこれらを適切に処理しないと思います。

1

この正規表現は、(で包まれているので)