封装检查和格式化的自定义对象怎么样?
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 位数的区号。如果您想反过来,请更改“选择...”组的顺序。
自定义对象的一个参数是,您可以轻松添加方法,例如.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位)
([0-9]{2}) # 第三组(2位)