尽管我经常使用正则表达式,但我很少创建自己的正则表达式。我最近一直在阅读它们,因为我需要为我正在进行的项目创建一些相当具体的表达式
关于表格中允许使用哪些电话号码,我有一个非常具体的摘要。前两个或前三个号码都有限制。
数字必须以06
或07
开头,或者以081
、082
、083
或084
开头。
我写了一个带有条件语句的正则表达式,我认为它应该做两件事之一:
- 如果数字以
06
或07
开头,则检查字符串中的其他8个字符是否为数字 - 如果数字以
08
开头,请检查下一个字符是否在1
和4
之间,然后检查其他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