2012-02-09 4 views
1

12桁の数字の文字列を検索する正規表現パターンを試してみようとしています。番号は、私が探しているものの前または後ろに任意の数の他の文字(数字ではない)を持つことができます。特定の長さの番号を見つける正規表現ですが、その前後の数字を除く任意の文字

これまでのところ、12桁の数字が正しく見つかる/([0-9]{12})/がありますが、文字列の13桁の数字にも一致します。

次の文字列に123456789012と一致している必要があり、パターン

  • "rgergiu123456789012ergewrg"
  • "123456789012"
  • "#123456789012"
  • "ergerg ergerwg erwgewrg \ nはrgergewrgrewg regewrge 123456789012 ergwerg"

これらの文字列では一致しないはずです:

  • "123456789012000"
  • "egjkrgkergr 123123456789012"
+1

http://regexpal.comは正規表現をテストするのに役立ちます。 – Xeoncross

答えて

2

ルックアラウンドとは何かしたいです。ような何か:パターンは、そのパターンを消費することなく、先行するか、別のパターンが続いている場合

/(?<![0-9])[0-9]{12}(?![0-9])/ 

先読みや後読みが一致します。したがって、このパターンは数字の前後にある文字を使用せずに、数字が前または後にない場合にのみ12桁に一致します。

+0

+1 [lookarounds](http://www.regular-expressions.info/lookaround.html) – Wiseguy

+0

Heh、編集のおかげで。 p –

+0

ブリリアント、説明のおかげで、正規表現は私のために黒い魔法のように見え始めている:) –

2

/\D(\d{12})\D/(この場合、番号が捕捉インデックス1であろう)

編集:おっと、数が全体の文字列である場合は、1つは、動作しないこと。代わりに

以下のいずれかを使用するか、ルックビハインド負でかつ先読み:/(?<!\d)\d{12}(?!\d)/(番号はなりキャプチャインデックス0)$stringは、あなたがしているテキストをある


if(preg_match("/(?<!\d)\d{12}(?!\d)/", $string, $matches)) { 
    $number = $matches[0]; 
    # .... 
} 

テスト

+0

\ dと[ 0-9]?もしそれらがかなり同義語であれば、私は個人的には[0-9]はもう少し読みやすいと思っています –

+0

彼らは単なる同義語です。 '\ d'は「数字」を意味し、「\ D」は「数字でない」を意味するので、ニーモニックであり、覚えやすい。しかし、表現を短くすることを別にすれば、利点はありません。 –

+0

@ZakHenry彼らは同じですが、私は '\ d'に慣れていて、5つではなく2つの文字であるため、個人的にはより読みやすくしています。 :-) – Wiseguy

関連する問題