チェックとフォーマットをカプセル化するカスタムオブジェクトはどうですか?
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桁)