想要使用以下标准验证电话号码。
- 最少6位数。
- 只能使用以下符号“+”,“(”,“)”,“ - ”。
- 不超过n个连续符号,但数字正常。
以下是我认为有效的一些例子:
07519767576
+447519767576
(02380) 346450
(+44) 7519767576
我一直在努力做这件事已经有一段时间了,但却打了一堵砖墙。这是我到目前为止所尝试的
^(?=.{9,}$)(?=[^0-9]*[0-9])(?:([\d\s\+\(\)\-])\1?(?!\1{5}))+?$
这种方法有效,但它有点像黑客,因为它也限制了连续数量。
我无法在PHP中执行此检查,它必须在JS中完成。如果没有正则表达式的学位,这甚至可能吗?
答案 0 :(得分:0)
至少有一项要求超出了传统常规语言的要求。正如评论中所指出的那样,在传统的常规语言中,不可能计算模式,组或正则表达式之间的位数,这些语言本质上使用Deterministic Finite Automata(也称为DFA)来计算正则表达式匹配。
PCRE compatible regular expressions,这是大多数语言,例如Javascript和Python,支持添加其他功能,例如回溯,预测匹配,分组,计算单个组等等。
这些增强了PCRE正则表达式可以匹配的模式集,或者更具技术性的表达式将接受的语言集。但据我所知,这些扩展都没有让你按照你想要的方式计算,至少直接。
证明PCRE兼容的正则表达式为NP-Complete in theory,但这并不意味着为给定问题编写正则表达式很容易甚至可行。
在大多数情况下,人们会用图灵完整的编程语言编写一个小型的手动解析器,可以轻松地完成你需要的工作。
OP提到这样做不是一种选择,因此问题已经停滞不前。