ファイルから電話番号を取得したいのですが。数字の形式が異なることは知っています。1つの数字を処理できますが、均一な正規表現を取得する方法がわかりません。例えば
xxx-xxx-xxxx
(xxx)xxx-xxxx
xxx xxx xxxx
xxxxxxxxxx
1、2、4しか一緒に扱えない
grep '[0-9]\{3\}[ -]\?[0-9]\{3\}[ -]\?[0-9]\{4\}' file
これら4つの形式すべてを処理できる単一の正規表現はありますか?
_grep '\(([0-9]\{3\})\|[0-9]\{3\}\)[ -]\?[0-9]\{3\}[ -]\?[0-9]\{4\}' file
_
説明:
_([0-9]\{3\})
_括弧内の3桁
_\|
_または
_[0-9]\{3\}
_ 3桁not親の内側
...グループ化括弧付き-\(...\)
-代替の周囲にあるため、どの代替が一致しても、残りの正規表現は同じように動作します。
通常、電話番号には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自体に任せることもできます〜
これは、AlanMooreのソリューションの修正バージョンにすぎません。これは、数値の最後の部分に4桁を超える数字が含まれている、または合計桁数が10を超える場合の競合状態から保護されます。
_grep '\(\(([0-9]\{3\})\|[0-9]\{3\}\)[ -]\?\)\{2\}[0-9]\{4\} '
_
説明:
\(([0-9]\{3\})\|[0-9]\{3\}\)
は、括弧で囲まれているかどうかに関係なく、正確に3桁(234など)に一致します。 _\|
_は「OR」演算を実行します。\( ... \)
は、上記の形式をグループ化し、その後にspace
または_-
_または_no space
_を続けます-(_[ -]\?
_)はこれを行います。\{2\}
_は、上記の2つのオカレンスに正確に一致します[0-9]\{4\} '
_は、4桁の数字の1つのオカレンスと一致し、その後にspace
が続きます。そして、それも少し短いです。 RHELおよびUbuntuでテスト済み。乾杯!!
あなたはただOR(|
)あなたの正規表現を一緒に-そうすればもっと読みやすくなります!
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}'
私の最初の考えは、候補番号が4つのうちの1つ正規表現と一致するかどうかを確認する方が簡単だと思うかもしれません。これは、特に将来追加のフォーマットを処理する必要がある場合に、開発/デバッグが容易になります。
これを試してください:
^(\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})$
これは、上記のように上記のギ酸塩にのみ適用されます。
xxxxxxxxxx
xxx xxx xxxx
xxx-xxx-xxxx
(xxx)xxx-xxxx
grep -oE '\(?\<[0-9]{3}[-) ]?[0-9]{3}[ -]?[0-9]{4}\>'
すべてのフォーマットに一致します。
\<
と\>
の単語の境界により、123-123-12345
や1234-123-1234
などの、長すぎる一致する数値を防ぐことができます。
+?(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
必要なすべての電話番号検証を、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
すべての特定の形式を返します: