0

重複の可能性:
電話番号の正規表現

私は正規表現に慣れていないので、その可能性はまだよくわかりません。したがって、この問題を解決するのが難しいかどうかはわかりません。

私は非常に自由にフォーマットされた電話文字列を持っており、それらを固定された方法でフォーマットする必要があります (少なくとも最善を尽くします)。「899-123-4-45; 22-56-87」、「5 99-25-31-71」、「577-345-678,274-89-56」。

私が知っている情報は次のとおりです。

新しい固定電話は 2-XX-XX-XX で始まり、その後に 6 つの数字が続きます (それらの間には "-" または " " の 2 種類の区切り文字があり、それらの番号は不明です)。

古い固定電話には XX-XX-XX の 6 つの番号しかありません。

古い携帯電話のコードには、8XX-YY-YY-YY の 9 つの数字が含まれています。最初のものは 8 です。XX はオペレーターのコードです (すべてを知っているわけではありません)。

新しい携帯電話コードには 5XX-YY-YY の 9 つの数字が含まれており、唯一の違いは最初の数字です。

一部のレコードには、古い固定電話コード、新しい固定電話コード、古い携帯電話コード、および新しい携帯電話コードが含まれています。

「-」と「,」の 2 つの区切り記号のみを使用して、すべての数値を新しい形式で保存する必要があります。例: 「599-12-34-56,2-45-61-34」、「2-45-65-12」、「574-12-34-56」。

どこから始めたらいいのかわからない。大きな文字列を数値を含むものだけで分割し、数値のみを取得してどの形式であるかを判断する必要がありますか? または、より簡単な解決策はありますか?

この文字列をどのように解析しますか: "574-12-34-56; 2 456 324, 455-566 2 22 40 56"? まず、これらを 3 つの部分に分割しますか? 「;」で分割できますか または " " または ","? 次に、数値のみを取得し、そのスタイルを決定して適切にフォーマットする必要がありますか?

4

2 に答える 2

1

(私の意見では)最善の解決策は、それぞれが異なる形式の複数の正規表現を使用することです。正規表現は非常に速く大きくなる傾向があるため、それらを維持することは困難な経験になる可能性があります。

私がすることはこれらのようなものを使用することです:

  • (2)[ -]+(\d{2})[ -]+(\d{2})[ -]+(\d{2})2-XX-XX-XX最初のパターンに一致するように(新しい固定電話):。
  • (\d{2})[ -]+(\d{2})[ -]+(\d{2})2番目のパターン(古い固定電話)に一致させる:6桁。
  • (8\d{2})[ -]+(\d{2})[ -]+(\d{2})[ -]+(\d{2})3番目のパターン(古い携帯電話)に一致させるには:8XX-YY-YY-YY
  • (5\d{2})[ -]+(\d{2})[ -]+(\d{2})[ -]+(\d{2})4番目のパターン(新しい携帯電話)に一致させるには:5XX-YY-YY-YY

上記の式を使用して、入力した数値の形式に一致する式を確認する必要があります。これらの式は、電話番号を構成する番号が空白()またはダッシュ(-)で区切られていることを前提としていることに注意してください。

パターンが一致する場合、正規表現エンジンは、電話番号を構成する番号も、(および)括弧で示されるグループに入れます。次に、これらのグループにアクセスして、新しくフォーマットされた電話を表す新しい文字列を作成することにより、任意の方法で電話番号を再構築できます。

Javasciptで正規表現グループを使用する方法については、こちらをご覧ください。

于 2012-10-19T06:44:11.607 に答える
1

別のアプローチをお勧めします。

まず、電話番号を区切る文字で文字列を分割します。

result = subject.split(/[,;]/);

次に、各部分文字列で、数字以外のすべての文字を削除します (場合によっては+、国際番号に関する情報を保持するためを除く)。

result[i] = result[i].replace(/[^\d+]+/g, "");

これで、区切り記号なしのすべての数値が得られました。次に、文字列を見て、それらをさまざまなカテゴリ (モバイル、固定電話、国際など) に分類し、独自のセパレーターを再導入することができます。あなたがそれを望んでいるなら。

于 2012-10-19T06:50:20.560 に答える