正规表达练习考试不明白为什么

时间:2014-02-19 14:28:51

标签: regex

我遇到了一个练习题考试问题:

  

为九位数字提供正则表达式,允许在第二个和第五个字符后面加上可选的连字符

给出的答案是:

  /^[0-9]{3}\^?[0-9]{2}\^?[0-9]{4}$/

我不明白为什么会这样。有人可以解释一下原因吗?如果这是错的,那么正确的答案是什么?它不包括连字符 - 插入符号确实应该有一个连字符。

3 个答案:

答案 0 :(得分:3)

  

它不包括连字符 - 插入符号确实应该有一个连字符。

确实是的。

  

如果错了,那么正确答案是什么?

/^[0-9]{2}-?[0-9]{3}-?[0-9]{4}$/

/^\d{2}-?\d{3}-?\d{4}$/

答案 1 :(得分:3)

是否正确:否

很容易检查Debuggex上给你的答案:

^[0-9]{3}\^?[0-9]{2}\^?[0-9]{4}$

Regular expression visualization

第一个^确保您匹配一行的开头,而最后一个$匹配该行的结尾。它确实匹配总共9位数(第一组3,然后是一组2,最后是一组4位)。它允许在第三个和第五个字符后面包含可选字符^。因此,我在给出的答案中看到两个错误:

  • 错误的字符^而不是-
  • 错误的位置:在第3和第5之后而不是第2和第5。

例如,以下示例在不正确时将被接受:

  • 12345^6789
  • 123^456789
  • 123^45^6789

正确答案

通过尽可能少的更改,您可以使用this

找到正确的结果
^[0-9]{2}-?[0-9]{3}-?[0-9]{4}$

Regular expression visualization

我只是更改了计数器,允许第2位和第5位后面的可选字符,并确保分隔符为-

例如,现在接受以下内容,因为它们应该(虽然给定的答案会拒绝它们!):

  • 12345-6789
  • 12-3456789
  • 12-345-6789

更好的回答

您可以将\ [0-9]替换为\ d,“数字”的快捷方式。

答案 2 :(得分:1)

你正在寻找一个更简单的正则表达式:

^\d{2}-?\d{3}-?\d{4}$
     ^ - optional dash after the 2nd character
            ^ - optional dash after the 5th character

Regular expression visualization

Debuggex Demo

和OR Mapper发表的评论,如果假设是一个可行的正则表达式,基于问题陈述, 它不是。 < /强>