Javascript JS RegEx.replace()条件模式&;子群

Javascript JS RegEx.replace()条件模式&;子群,javascript,regex,Javascript,Regex,我需要格式化比利时电话号码。根据城市的不同,本地前缀的长度可以是1个或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-

我需要格式化比利时电话号码。根据城市的不同,本地前缀的长度可以是1个或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})/
/(0{0,3}32)(9|8|7|6|5|4|3|2)([0-9]{3})([0-9]{2})([0-9]{2})/
1个字符前缀:

/(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})/
/(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()模式吗?

您的第一个正则表达式可以简化为:

(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})
(0{0,3}32)([2-9])([0-9]{3})([0-9]{2})([0-9]{2})
您的第二个也可以简化为:

(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})
(0{0,3}32)([2-9])([0-9]{3})([0-9]{2})([0-9]{2})
这是组合这两个regexp的可能解决方案之一:

(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

封装检查和格式化的自定义对象如何

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;
        }
    }
}
用法

不过,我不知道这两个编号模式是否会重叠,从而在匹配时产生误报

然而,当有疑问时,正则表达式支持2位区号而不是1位区号。如果你想让它反过来,改变“选择…”组的顺序

自定义对象的一个参数是,您可以轻松添加方法,如
.getAreaCode()
,或将区号映射到城市名称的方法。由于重写了
.toString()
方法,您仍然可以在字符串中直接使用它

组合正则表达式分解为

0{0,3}32 # constant prefix, therefore no group (?: # choice: either... (9[23]|8[0-79|7[1]|6[0-579]|5[0-9]|2[2568]|1[0-69]) # 2-digit area code ([0-9]{2}) # first group (2 digits) | # or... ([2-9]) # 1-digit area code ([0-9]{3}) # first group (3 digits) ) # end choice ([0-9]{2}) # second group (2 digits) ([0-9]{2}) # third group (2 digits) 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位)
为什么不把不必要的组设为非捕获的呢?这不会改变匹配的字符串。@RohitJain如果我很了解输入/输出,每个组都会被使用。你说的是什么不必要的组?我指的是你创建的用来组合那些正则表达式的外部组。比如:-
/(0{0,3}32)(?:(9[23]| 8[0-79]|71 | 6[0-579]| 5[0-9]| 2[25-68]| 1[0-69]([0-9]{2})([0-9]{3})([0-9]{2})([0-9]{2}/
现在捕获的组是相同的。但这真的没什么大不了。它仍然能完成任务。+1。是的-
[2-3]
感谢您帮助我理解了之前发布的正则表达式!