2017-11-27 27 views
3

PHPでregexに少しだけ問題があり、コーディングを開始しました。正規表現での正規表現9文字の文字列からの数字のタイプ

文字列から次の数値型をキャッチしようとしています。

000 000 00 00 - 
000 000 00 0 - 
000 000 00 - 
000.000.00.00 - 
000.000.00.0 - 
000.000.00 - 
0000000000 - 
000000000 - 
00000000 - 

もちろん、0は0-9の間の数値を表します。

これは私が試したパターンです:

$pattern = "/\d{3}[. ]\d{3}[. ]\d{2}[. ]?\d{1-2}?/"; 

何かがここで間違っているが、私は何を理解していませんか?

私を助けることができますか?数字が文字に接着または_がこれを削除することができればワード境界( -

+0

制限数量子は '{1,2}'ではありません。 –

+0

['\ b \ d {3}([。\ h]?)\ d {3} \ 1 \ d {2}(?:\ 1 \ d {1,2})?\ b'](https://regex101.com/r/TneMp5/2) –

+2

ここで何が間違っていますか?それは何と一致しますか?何が一致しないのですか?スペースもあり、最後の ' - 'は必要ですが、あなたのパターンではありませんか? – AbraCadaver

答えて

4

は、あなたがregex demo

詳細

  • \bを参照してください

    /\b\d{3}([.\s]?)\d{3}\1\d{2}(?:\1\d{1,2})?\b/ 
    

    を使用することができそうですまたは(?<!\d)と置き換えます)

  • \d{3}から3桁の数字
  • ([.\s]?)から2 - グループ1
  • \d{2}と同じ値 - 3桁の数字
  • \1 - グループ1
  • \d{3}取り込ま任意.又は空白、1又は0回、数字
  • (?:\1\d{1,2})? -
    • \1のオプションのシーケンス - グループ内と同じ値1
    • \d{1,2} - 1又は2桁
  • \b - 末尾の単語境界((?!\d)実際の要件に応じて交換/削除)。 PHPで

$contents = file_get_contents('test.txt'); 
$pattern = '/\b\d{3}([.\s]?)\d{3}\1\d{2}(?:\1\d{1,2})?\b/'; 
preg_match_all($pattern, $contents, $results); 
print_r($results); 

マインドパターンの周りの単一引用符:あなたの代わりに二重引用符を使用する場合"\1"が持つ文字が定義されているので、あなたは(少なくとも\1で)バックスラッシュを倍増する必要があります8進数は1で、'\1'はバックスラッシュとして、1として解析されます。