2

ベルギーの電話番号をフォーマットする必要があります。都市に応じて、ローカルプレフィックスの長さは1文字または2文字であり、それらすべてに一致する単一の正規表現を作成する方法がわかりません...

これが私がこれまでに得たものです、それは動作します、しかしそれは2つのステップを取ります:

2文字のプレフィックス:

/(0{0,3}32)(93|92|89|87|86|85|84|83|82|81|80|71|69|67|65|64|63|62|61|60|59|58|57|56|55|54|53|52|51|50|28|26|25|22|19|16|15|14|13|12|11|10)([0-9]{2})([0-9]{2})([0-9]{2})/

1文字のプレフィックス:

/(0{0,3}32)(9|8|7|6|5|4|3|2)([0-9]{3})([0-9]{2})([0-9]{2})/

そしてパターン:

"+$1 $2 $3 $4 $5"

.replace()に同じパターンを使用するだけでなく、2つの正規表現を組み合わせる方法はありますか?

4

2 に答える 2

2

チェックとフォーマットをカプセル化するカスタムオブジェクトはどうですか?

function BelgianPhoneNumber(inputStr) {
    var re = /0{0,3}32(?:(9[23]|8[0-79|7[1]|6[0-579]|5[0-9]|2[2568]|1[0-69])([0-9]{2})|([2-9])([0-9]{3}))([0-9]{2})([0-9]{2})/,
        match, area, grp1, grp2, grp3;

    if (match = re.exec(inputStr)) {
        if (match[1]) {
            area = match[1];
            grp1 = match[2];
        } else {
            area = match[3];
            grp1 = match[4];
        }
        grp3 = match[5];
        grp4 = match[6];
    } else {
        area = grp1 = grp2 = grp3 = "";
        // possibly throw error
    }

    this.toString = function () {
        if (match) {
            return ["+32", area, grp1, grp2, grp3].join(" ");
        } else {
            return "invalid phone number: " + inputStr;
        }
    }
}

使用法

var p = new BelgianPhoneNumber("003233437667");
console.log("Phone: " + p);  // -> Phone: +32 3 343 76 67

var p = new BelgianPhoneNumber("003287565656")
console.log("Phone: " + p);  // -> Phone: +32 87 56 56 56

ただし、2つの番号付けスキーマが重複する可能性があるかどうかはわかりませんが、一致すると誤検知が発生します。

ただし、疑わしい場合は、正規表現は1桁の市外局番よりも2桁の市外局番を優先します。逆の場合は、「choice...」グループの順序を変更してください。

.getAreaCode()カスタムオブジェクトの引数は、市外局番を都市名にマップするようなメソッドを簡単に追加できるということです。.toString()また、オーバーライドされたメソッドのおかげで、文字列内で直接使用することもできます。

結合された正規表現は次のように分類されます

0 {0,3} 32#定数プレフィックス、したがってグループなし
(?:#選択:どちらか..。
  (9 [23] | 8 [0-79 | 7 [1] | 6 [0-579] | 5 [0-9] | 2 [2568] | 1 [0-69])#2桁の市外局番
  ([0-9] {2})#最初のグループ(2桁)
  | # また...
  ([2-9])#1桁の市外局番
  ([0-9] {3})#最初のグループ(3桁)
)#選択を終了
([0-9] {2})#2番目のグループ(2桁)
([0-9] {2})#3番目のグループ(2桁)
于 2013-02-14T13:45:05.027 に答える
1

最初の正規表現は次のように減らすことができます。

(0{0,3}32)(9[23]|8[0-79]|71|6[0-79]|5[0-9]|2[2568]|1[0-69])([0-9]{2})([0-9]{2})([0-9]{2})

2番目のものも次のように減らすことができます。

(0{0,3}32)([2-9])([0-9]{3})([0-9]{2})([0-9]{2})

これは、これら2つの正規表現を組み合わせるための可能な解決策の1つです。

(0{0,3}32)(?:(9[23]|8[0-79]|71|6[0-79]|5[0-9]|2[2568]|1[0-69])([0-9]{2})|([2-9])([0-9]{3}))([0-9]{2})([0-9]{2})

必要なすべてのグループに引き続きアクセスできます。ただし、グループのインデックスは変更されました。質問で指定した形式を取得するには、一致する文字列を次のように置き換えます。

+$1 $2$4 $3$5 $6 $7

デモ

于 2013-02-14T11:22:11.720 に答える