我正在尝试制作一个仅接受列出格式的电话号码的正则表达式。但是,如果我用右括号结束第一个三位数组,而在开始时没有左括号,则当我希望它返回 false 时,测试将返回 true。我能做什么?
1 555-555-5555
1 (555) 555-5555
1(555)555-5555
1 555 555 5555
5555555555
555-555-5555
(555)555-5555
const validNumbers = /^[1]? ?[(]?[0-9]{3}[)]?\s?[0-9]{3}[-\s]?[0-9]{4}$/i
console.log(validNumbers.test("1 305) 9759003"))
在模式
[(]?[0-9]{3}[)]?
中,左括号和右括号是可选的。这些与可选括号之间没有关系。因此,它将匹配 012
、(012
、012)
和 (012)
。
Regex 无法“记住”它之前是否找到了括号。因此,如果您只想在获得左括号时匹配右括号,则必须明确区分以下两种模式:
[(][0-9]{3}[)]
),或[0-9]{3}
)。这会转换为以下正则表达式:
([(][0-9]{3}[)]|[0-9]{3})
。完整的正则表达式如下所示:
const validNumbers = /^[1]? ?([(][0-9]{3}[)]|[0-9]{3})\s?[0-9]{3}[-\s]?[0-9]{4}$/i
对于您的测试字符串,我们得到以下内容:
>>> console.log(validNumbers.test("1 305) 9759003"))
false
>>> console.log(validNumbers.test("1 (305) 9759003"))
true
const validNumbers = /^1? ?(\([0-9]{3}\)|[0-9]{3})[-\s]?[0-9]{3}[-\s]?[0-9]{4}$/;
解释:
^1? ?
:字符串的开头可能包含 1,后跟可选空格。
(\([0-9]{3}\)|[0-9]{3})
:匹配 3 个数字,可以将其括在匹配的括号中,也可以不使用它们单独使用。
[-\s]?
:允许可选的破折号 (-) 或空格。
[0-9]{3}
:匹配下一组 3 位数字。
[-\s]?
:允许另一个可选的破折号或空格。
[0-9]{4}$
:匹配字符串末尾的最后一组 4 位数字。