Regex 用于匹配特定电话号码的正则表达式
我正在尝试查看一个字符串是否与我所在国家的电话号码格式匹配,即区号(两位数字前面可能有0,也可能没有0,也可能在括号之间),后面是8或9位数字,其中最后4位数字之前可能有破折号字符。 以下是一些有效的格式: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?-
'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}$