带有条件语句的正则表达式验证 JavaScript 中的 phone 数字
Regular expression with a conditional statement that validates a phone number in JavaScript
虽然我经常使用正则表达式,但我很少创建自己的正则表达式。我最近一直在阅读它们,因为我需要为我正在进行的项目创建一些相当具体的表达式。
关于表格中允许使用哪些电话号码,我有一个非常具体的简介。前两个或前三个数字都有限制。
数字必须以 06
或 07
开头,或者以 081
、082
、083
或 084
开头。
我写了一个带有条件语句的正则表达式,我认为它应该做以下两件事之一:
- 如果数字以
06
或07
开头,则检查字符串中的其他8个字符是否为数字。
- 如果数字以
08
开头,检查下一个字符是否在 1
和 4
之间,然后检查其他 7 个字符是否为数字。
I used this tutorial to learn how conditionals work in regex. 这是我创建的表达式:
const validMobile = new RegExp(/^((0)?([6-7])[0-9]{8}|([8])[1-4][0-9]{7}) *$/);
我这里的理解是这样的:
/^
(开头为)
(0)
(必须先有一个零)
?([6*7])
(如果第二个字符是六七)
[0-9]{8}
(检查接下来的八个字符是否为 0 到 9 之间的数字)
|(8)
(否则如果第二个字符是八)
[1-4]
(检查第三个字符是否为一到四之间的数字)
[0-9]{7}
(检查以下七个字符是否为零到九之间的数字)
请注意,正在别处检查字符串的长度,尽管我认为这个表达式也应该有助于检查数字是否恰好为 10 个字符长。
这没有达到预期的效果,所以我一定是误会了什么。谁能帮助我了解我可能哪里出错了?
您的正则表达式的问题在于两个备选方案 (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...
上亲自看看
对原始正则表达式的进一步评论:
- 零后面的
?
实际上使它成为可选的,这就是我删除它的原因。
- 您有一些可疑的捕获组(
([6-7])
和 ([8])
),您真的需要那些吗?
- 由@AmigoJack 发起的更多清理工作:角色 class
[8]
无效 -> 8
.
- 圆括号不是为了好玩:如果您不想捕获任何内容,请不要使用它们。仅将它们用于您的
(this|that)
问题,其中管道用作 OR 运算符。
- 如果您只允许 2 个字符,则方括号不需要范围。
- 如果一个字符是强制性的,那么就写吧。不要放在方括号里,也不要放在圆括号里。
?
是量词,意思是前面的是可选的(可以出现 0 次或一次)。如果你把它放在你的零后面,那么你就使它与“必须在那里”相反。
考虑到这些知识并将正则表达式写入多行并忽略它之间的任何空格然后得出:
^0(
[67][0-9]{8}
|
8[1-4][0-9]{7}
)$
我还删除了您的 phone 号码后的可选空格:您没有解释说您想要这样的东西,也不在您的列表中。仅在 phone 数字之后允许空格而不在前面允许空格是没有意义的。所以 *
部分也不是为了好玩。
我也强烈反对在 phone 数字上使用正则表达式:人们倾向于输入 phone 数字 而不是 之间没有空格或连字符。看看 all the existing Qs.
虽然我经常使用正则表达式,但我很少创建自己的正则表达式。我最近一直在阅读它们,因为我需要为我正在进行的项目创建一些相当具体的表达式。
关于表格中允许使用哪些电话号码,我有一个非常具体的简介。前两个或前三个数字都有限制。
数字必须以 06
或 07
开头,或者以 081
、082
、083
或 084
开头。
我写了一个带有条件语句的正则表达式,我认为它应该做以下两件事之一:
- 如果数字以
06
或07
开头,则检查字符串中的其他8个字符是否为数字。 - 如果数字以
08
开头,检查下一个字符是否在1
和4
之间,然后检查其他 7 个字符是否为数字。
I used this tutorial to learn how conditionals work in regex. 这是我创建的表达式:
const validMobile = new RegExp(/^((0)?([6-7])[0-9]{8}|([8])[1-4][0-9]{7}) *$/);
我这里的理解是这样的:
/^
(开头为)(0)
(必须先有一个零)?([6*7])
(如果第二个字符是六七)[0-9]{8}
(检查接下来的八个字符是否为 0 到 9 之间的数字)|(8)
(否则如果第二个字符是八)[1-4]
(检查第三个字符是否为一到四之间的数字)[0-9]{7}
(检查以下七个字符是否为零到九之间的数字)
请注意,正在别处检查字符串的长度,尽管我认为这个表达式也应该有助于检查数字是否恰好为 10 个字符长。
这没有达到预期的效果,所以我一定是误会了什么。谁能帮助我了解我可能哪里出错了?
您的正则表达式的问题在于两个备选方案 (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...
上亲自看看对原始正则表达式的进一步评论:
- 零后面的
?
实际上使它成为可选的,这就是我删除它的原因。 - 您有一些可疑的捕获组(
([6-7])
和([8])
),您真的需要那些吗? - 由@AmigoJack 发起的更多清理工作:角色 class
[8]
无效 ->8
.
- 圆括号不是为了好玩:如果您不想捕获任何内容,请不要使用它们。仅将它们用于您的
(this|that)
问题,其中管道用作 OR 运算符。 - 如果您只允许 2 个字符,则方括号不需要范围。
- 如果一个字符是强制性的,那么就写吧。不要放在方括号里,也不要放在圆括号里。
?
是量词,意思是前面的是可选的(可以出现 0 次或一次)。如果你把它放在你的零后面,那么你就使它与“必须在那里”相反。
考虑到这些知识并将正则表达式写入多行并忽略它之间的任何空格然后得出:
^0(
[67][0-9]{8}
|
8[1-4][0-9]{7}
)$
我还删除了您的 phone 号码后的可选空格:您没有解释说您想要这样的东西,也不在您的列表中。仅在 phone 数字之后允许空格而不在前面允许空格是没有意义的。所以 *
部分也不是为了好玩。
我也强烈反对在 phone 数字上使用正则表达式:人们倾向于输入 phone 数字 而不是 之间没有空格或连字符。看看 all the existing Qs.