web-dev-qa-db-ja.com

電話番号の正規表現を使用したgrep

ファイルから電話番号を取得したいのですが。数字の形式が異なることは知っています。1つの数字を処理できますが、均一な正規表現を取得する方法がわかりません。例えば

  1. xxx-xxx-xxxx

  2. (xxx)xxx-xxxx

  3. xxx xxx xxxx

  4. xxxxxxxxxx

1、2、4しか一緒に扱えない

grep '[0-9]\{3\}[ -]\?[0-9]\{3\}[ -]\?[0-9]\{4\}' file

これら4つの形式すべてを処理できる単一の正規表現はありますか?

17
skydoor
_grep '\(([0-9]\{3\})\|[0-9]\{3\}\)[ -]\?[0-9]\{3\}[ -]\?[0-9]\{4\}' file
_

説明:

_([0-9]\{3\})_括弧内の3桁

_\|_または

_[0-9]\{3\}_ 3桁not親の内側

...グループ化括弧付き-\(...\)-代替の周囲にあるため、どの代替が一致しても、残りの正規表現は同じように動作します。

18
Alan Moore

通常、電話番号には4つのパターンがあります

1. xxx-xxx-xxxx         grep -o '[0-9]\{3\}\-[0-9]\{3\}\-[0-9]\{4\}'  file.txt
2. (xxx)xxx-xxxx        grep -o '([0-9]\{3\})[0-9]\{3\}\-[0-9]\{4\}'  file.txt
3. xxx xxx xxxx         grep -o '[0-9]\{3\}\s[0-9]\{3\}\s[0-9]\{4\}'  file.txt
4. xxxxxxxxxx           grep -o '[0-9]\{10\}' file.txt

全部で

grep -o '\([0-9]\{3\}\-[0-9]\{3\}\-[0-9]\{4\}\)\|\(([0-9]\{3\})[0-9]\{3\}\-[0-9]\{4\}\)\|\([0-9]\{10\}\)\|\([0-9]\{3\}\s[0-9]\{3\}\s[0-9]\{4\}\)' file.txt

もちろん、上記の正規表現を単純化することもできますが、この単純化をgrep自体に任せることもできます〜

7
Raullen Chai

これは、AlanMooreのソリューションの修正バージョンにすぎません。これは、数値の最後の部分に4桁を超える数字が含まれている、または合計桁数が10を超える場合の競合状態から保護されます。

_grep '\(\(([0-9]\{3\})\|[0-9]\{3\}\)[ -]\?\)\{2\}[0-9]\{4\} '
_

説明:

  1. \(([0-9]\{3\})\|[0-9]\{3\}\)は、括弧で囲まれているかどうかに関係なく、正確に3桁(234など)に一致します。 _\|_は「OR」演算を実行します。
  2. 最初の\( ... \)は、上記の形式をグループ化し、その後にspaceまたは_-_または_no space_を続けます-(_[ -]\?_)はこれを行います。
  3. _\{2\}_は、上記の2つのオカレンスに正確に一致します
  4. _[0-9]\{4\} '_は、4桁の数字の1つのオカレンスと一致し、その後にspaceが続きます。

そして、それも少し短いです。 RHELおよびUbuntuでテスト済み。乾杯!!

6
MacUsers

あなたはただOR(|)あなたの正規表現を一緒に-そうすればもっと読みやすくなります!

2
Arkady
grep -P '[0-9]{3}-[0-9]{3}-[0-9]{3}|[0-9]{3}\ [0-9]{3}\ [0-9]{3}|[0-9]{9}|\([0-9]{3}\)[0-9]{3}-[0-9]{3}'
1
D W

私の最初の考えは、候補番号が4つのうちの1つ正規表現と一致するかどうかを確認する方が簡単だと思うかもしれません。これは、特に将来追加のフォーマットを処理する必要がある場合に、開発/デバッグが容易になります。

1
Brian Agnew

これを試してください:

^(\d{10}|((([0-9]{3})\s){2})[0-9]{4}|((([0-9]{3})\-){2})[0-9]{4}|([(][0-9]{3}[)])[0-9]{3}[-][0-9]{4})$

これは、上記のように上記のギ酸塩にのみ適用されます。

  1. xxxxxxxxxx
  2. xxx xxx xxxx
  3. xxx-xxx-xxxx
  4. (xxx)xxx-xxxx
0
Tahir khan
grep -oE '\(?\<[0-9]{3}[-) ]?[0-9]{3}[ -]?[0-9]{4}\>'

すべてのフォーマットに一致します。

\<\>の単語の境界により、123-123-123451234-123-1234などの、長すぎる一致する数値を防ぐことができます。

0
glenn jackman

+?(1 [-])?((\ d {3})[-] |(\ d {3} [-]?)){2}\d {4}

のために働く:

123-678-1234

123 678 1234

(123)-678-1234

+ 1-(123)-678-1234

1-(123)-678-1234

1123678 1234

1(123)678 1234

0
gein

必要なすべての電話番号検証を、or条件を使用して1つずつ配置できます。

grep '^[0-9]\{10\}$\|^[0-9]\{3\}[-][0-9]\{3\}[-][0-9]\{4\}$\|^[0-9]\{3\}[ ][0-9]\{3\}[ ][0-9]\{4\}$\|^[(][0-9]\{3\}[)][0-9]\{3\}[-][0-9]\{4\}$' phone_number.txt

すべての特定の形式を返します:

  • 920-702-9999
  • (920)702-9999
  • 920 702 9999
  • 9207029999
0
Aparna