带有条件语句的正则表达式,该条件语句在JavaScript中验证电话号码



尽管我经常使用正则表达式,但我很少创建自己的正则表达式。我最近一直在阅读它们,因为我需要为我正在进行的项目创建一些相当具体的表达式

关于表格中允许使用哪些电话号码,我有一个非常具体的摘要。前两个或前三个号码都有限制。

数字必须以0607开头,或者以081082083084开头。

我写了一个带有条件语句的正则表达式,我认为它应该做两件事之一:

  1. 如果数字以0607开头,则检查字符串中的其他8个字符是否为数字
  2. 如果数字以08开头,请检查下一个字符是否在14之间,然后检查其他7个字符是否为数字

我使用本教程来学习条件语句如何在regex中工作。这是我创建的表达式:

const validMobile = new RegExp(/^((0)?([6-7])[0-9]{8}|([8])[1-4][0-9]{7}) *$/);

我在这里的理解如下:

  • /^(以开头(
  • (0)(必须先为零(
  • ?([6*7])(如果第二个字符是六或七(
  • [0-9]{8}(检查接下来的八个字符是否为零到9之间的数字(
  • |(8)(否则,如果第二个字符为八(
  • [1-4](检查第三个字符是否为一到四之间的数字(
  • [0-9]{7}(检查以下七个字符是否为零到九之间的数字(

注意,字符串的长度正在其他地方检查,尽管我认为这个表达式也应该有助于检查数字是否正好是10个字符长。

这并没有达到预期的结果,所以我一定是误解了什么。有人能帮我了解一下我哪里可能出了问题吗?

  • 圆括号不是为了好玩:如果你不想捕捉任何东西,就不要使用它们。仅将它们用于(this|that)问题,其中管道作为OR运算符工作
  • 如果您只允许2个字符,方括号就不需要范围
  • 如果有一个字符是必须的,那就写出来吧。不要把它放在方括号里,也不要放在圆括号里
  • ?是一个量词,意思是之前发生的事情是可选的(可以发生0次或一次(。如果你把它放在零后面,那么你就把它变成了"零"的反面;必须在那里">

记住这些知识,将正则表达式写入多行并忽略其间的任何空白,然后得出:

^0(
[67][0-9]{8}
|
8[1-4][0-9]{7}
)$

我还删除了你电话号码后面的可选空格:你没有解释过你想要这样的东西,也没有在你的列表中。只在电话号码后面而不在前面留出空间也没有意义。所以*部分也不是为了好玩。

我也强烈反对在电话号码上使用regex:人们倾向于输入电话号码,而不是,中间没有空格或连字符。查看所有现有的Q。

正则表达式的问题是(0)?([6-7])[0-9]{8}([8])[1-4][0-9]{7}这两个选项。第一个数字中有前导零,所以像0811234567这样需要与第二个匹配的数字永远不会匹配。如果你把零从第一个选项移到外面,它就会开始按你的意图工作:

^0(([6-7])[0-9]{8}|(8)[1-4][0-9]{7}) *$

查看regex101…

对原始regexp:的进一步评论

  • 零后的?实际上使它成为可选的,这就是我删除它的原因
  • 你有一些可疑的捕获组(([6-7])([8])(,你真的需要这些吗
  • 更多的清理是由@AmigoJack推动的:角色类[8]没有效果->CCD_ 29

最新更新