我怎样才能让我的正则表达式只接受右括号(如果它已经匹配左括号)

问题描述 投票:0回答:2

我正在尝试制作一个仅接受列出格式的电话号码的正则表达式。但是,如果我用右括号结束第一个三位数组,而在开始时没有左括号,则当我希望它返回 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"))
javascript regex
2个回答
0
投票

在模式

[(]?[0-9]{3}[)]?
中,左括号和右括号是可选的。这些与可选括号之间没有关系。因此,它将匹配
012
(012
012)
(012)

Regex 无法“记住”它之前是否找到了括号。因此,如果您只想在获得左括号时匹配右括号,则必须明确区分以下两种模式:

  • 有一个左括号、3 个数字和一个右括号 (
    [(][0-9]{3}[)]
    ),或
  • 只有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

0
投票
  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 位数字。

© www.soinside.com 2019 - 2024. All rights reserved.