Regex 用于匹配特定电话号码的正则表达式

Regex 用于匹配特定电话号码的正则表达式,regex,ruby,regex-lookarounds,regex-group,regex-greedy,Regex,Ruby,Regex Lookarounds,Regex Group,Regex Greedy,我正在尝试查看一个字符串是否与我所在国家的电话号码格式匹配,即区号(两位数字前面可能有0,也可能没有0,也可能在括号之间),后面是8或9位数字,其中最后4位数字之前可能有破折号字符。 以下是一些有效的格式: '00 00000000' '000-000000000' '000 00000-0000' '00 0000-0000' '(00) 0000-0000' '(000) 000000000' 到目前为止,这是我的工作表达式: p=/0?\d{2}\s?-?\s?\d{4,5}\s?-

我正在尝试查看一个字符串是否与我所在国家的电话号码格式匹配,即区号(两位数字前面可能有0,也可能没有0,也可能在括号之间),后面是8或9位数字,其中最后4位数字之前可能有破折号字符。 以下是一些有效的格式:


'00 00000000'
'000-000000000'
'000 00000-0000'
'00 0000-0000'
'(00) 0000-0000'
'(000) 000000000'
到目前为止,这是我的工作表达式:


p=/0?\d{2}\s?-?\s?\d{4,5}\s?-?\s?\d{4}/
我试图使用一个条件来查看区号是否在括号内,带有
/(\()0?\d{2}\)\1240?\d{2}\s?\d{4,5}\s?\d{4}/
,但得到了
(repl):1:未指定重复运算符的目标:/?(\()0?\d{2}\)\s?\d{4}错误码


我做错了什么?

可能有几种方法来验证这些数字。一种方法是,我们写下所有可能的电话号码,然后为它写一个表达式。也许,类似于:

[0-9]{2,3}(\s|-)[0-9]{4,5}-?[0-9]{3,4}
试验 演示 此代码段仅用于显示捕获组以及表达式可能有效:

const regex=/[0-9]{2,3}(\s|-)[0-9]{4,5}-?[0-9]{3,4}/gm;
常量str=`00 00000000'
'000-000000000'
'000 00000-0000'
'00 0000-0000'`;
让m;
while((m=regex.exec(str))!==null){
//这是避免具有零宽度匹配的无限循环所必需的
if(m.index==regex.lastIndex){
regex.lastIndex++;
}
//可以通过'm`-变量访问结果。
m、 forEach((匹配,组索引)=>{
log(`Found match,group${groupIndex}:${match}`);
});

}
不使用正则表达式验证电话号码。我打赌你不想排除偶尔键入2个后续空格或其他内容的可能性

相反,过滤掉所有非数字和前导零,然后进行验证。像这样:

number.gsub(/\D+/, '').gsub(/\A0+/) =~ /\d{8,9}/

我不确定它是否能满足你的需要,但我敢打赌,你已经抓住要点了。毕竟,
[000]123456789
是一个可以理解的电话号码。

我相信您可以使用以下正则表达式

R = /
    \A            # match beginning of string
    (?:           # begin a non-capture group
      \(0?\d{2}\) # match '(' then an optional `0` then two digits then ')'
    |             # or
      0?\d{2}     # match an optional `0` then two digits
    )             # end the non-capture group
    (?:           # begin a non-capture group
      [ ]+        # match one or more spaces
    |             # or
      -           # match a hyphen
    )             # end the non-capture group
    \d{4,5}       # match 4 or 5 digits
    -?            # optionally match a hyphen
    \d{4}         # match 4 digits
    \z            # match end of string
    /x            # free-spacing regex definition mode

正则表达式按惯例编写如下

R = /\A(?:\(0?\d{2}\)|0?\d{2})(?: +|-)\d{4,5}-?\d{4}\z/
如果前导数字不能等于零,则应按如下方式进行更改。(例如,如果
'001-123456789'
'(12)-023456789'
无效。)

我的回答回答了您关于可选括号的想法。
Ruby从v2.0开始就支持条件语句。是
(?(A)X | Y)
:如果A为真,则X为真

  • 在开头放一个包含左括号的句子:
    ^(\()?
  • 稍后在模式中的任何位置检查是否成功:
    (?(1)\)\124;[-])

    如果成功:要求在空格后加一个结束符
    |
    其他:
    [-]
    空格或破折号
因此,整个带有条件的模式可以是

^(\()?0?\d{2}(?(1)\) |[ -])\d{4,5}[ -]?\d{4}$
看手术室。进一步调整以适应您的需要


另一种方法是使用交替
(?:\(abc\)\abc)
,其中@CarySwoveland已经回答了,但@AlekseiMatiushkin的回答肯定会让生活更轻松。

除非你知道自己的工作范围非常非常有限,例如

  • 这些数字将被传递到一个只接受特定格式的系统,这样您就知道这些格式是准确的,其他格式就不起作用了
  • 这些数字只是由一个人读取的,所以你可以让他们计算出来,而不需要验证任何东西

否则,你应该使用一个强大的库,如(受谷歌启发)

你能提供一些电话号码包含括号的示例吗?当你说9位数字时,你是指4位数字,破折号,然后是4位数字吗?刚刚添加了示例。它可能是4位数字,破折号,然后是4位数字,但也可能是5位数字,破折号和4位数字。我已经发布了一个解决括号问题的答案,请随意检查它。
[0-9]{2,3}
将匹配
999
,这必须根据OP排除。是的,但是如果我把
0?\d{2}
放进去,它应该会这样做,对吗?我只是用括号@Emma添加了更多的例子,这是almos,但它不能匹配一个只有开括号或闭括号的字符串,如
(00 0000-0000
。此外,区号必须是可选的“0”,后跟两位数字。@Emma是,但此格式无效。我想在表达式中验证的是,如果区号前有一个左括号,则还应该有一个右括号。如
(0000000000
不应该是有效的,但是
0000000000
(00)000000000
应该是有效的。谢谢!这是一个好主意,我一定会这么做。穆西,我相信你的意思是
.gsub(/\A0+/,'')
。这并不能告诉我们字符串是否代表有效的电话号码,但这不是一个想法吗?例如,
“大约99.473218%的Rubiest使用snake大小写作为变量和方法的名称。”.gsub(/\D+/,“”).gsub(/\A0+/,“”)=~/\D{8,9}”/#=>0
。我通过拨打那个号码确认了这一点,但没有听到铃声。这难道不符合要求,因为只有一个前导0应该被忽略吗?如果要求是为了吓唬用户,或者是为了玩regex golf,那么是的,上述方法不起作用。如果目标是验证用户的输入,那么这是唯一的方法。因为当他们拒绝我输入的号码时,因为他们有一个复杂的正则表达式,你知道,我会永远关闭这个页面。毕竟,555个数字会通过,而它们肯定是无效的。但是如果它接受无效输入,然后他们就不能给你打电话,因为它们存储了一个无效的号码…这也让条件表达式很恼火对于我来说,这是一个新的工具,当然也是我的工具带中值得一提的一部分。考虑到它是如此的潜在有用,而且Ruby v2.0已经推出这么长时间了,我很惊讶我以前在这里还没有看到它被使用过。
R = /\A(?:\(0?\d{2}\)|0?\d{2})(?: +|-)\d{4,5}-?\d{4}\z/
R = /\A(?:\(0?[1-9]\d\)|0?\[1-9]\d)(?: +|-)[1-9]\d{3,4}-?\d{4}\z/
^(\()?0?\d{2}(?(1)\) |[ -])\d{4,5}[ -]?\d{4}$