Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 为什么这个正则表达式允许星号通过?_Regex - Fatal编程技术网

Regex 为什么这个正则表达式允许星号通过?

Regex 为什么这个正则表达式允许星号通过?,regex,Regex,我需要做一个奇怪的电话验证。下面的模式对于我需要验证的规则非常有效,但由于某些原因,星号被允许通过 ^(?=.{10,15}$)[\(\)-. ]*?([0-9]{3})[\(\)-. ]*?([0-9]{3})[\(\)-. ]*?([0-9]{4}) 我一直在使用此网站测试我的表达: 以下是我需要传递的值: (501)5551234 (501)-555.1234 501-555-1234 501.555.1234 501 555 1234 501)343-2233 (501 343-22

我需要做一个奇怪的电话验证。下面的模式对于我需要验证的规则非常有效,但由于某些原因,星号被允许通过

^(?=.{10,15}$)[\(\)-. ]*?([0-9]{3})[\(\)-. ]*?([0-9]{3})[\(\)-. ]*?([0-9]{4})
我一直在使用此网站测试我的表达:

以下是我需要传递的值:

  • (501)5551234
  • (501)-555.1234
  • 501-555-1234
  • 501.555.1234
  • 501 555 1234
  • 501)343-2233
  • (501 343-2233)
  • (501.343-2233)
  • 5013432233
  • 800-…555-1234
  • -(.8005551234)
以下是我失败所需的值:

  • *-(.8005551234)
  • 501*555-1234
  • -(.80055512 41)
  • 501_555_1234
  • 555-1234
  • 800-555-1234
  • 013432233
这些规则是:

  • 字符串的总长度必须为10-15个字符
  • 字符串中必须正好包含10位数字
  • 字符串中可以包含“(”、”、“、”或“-”分隔符
  • 只要数字在{3}{3}{4}中分组,那么分组多少分隔符并不重要
  • 所以有两个问题:

  • 我需要做什么更改才能消除星号通过?
  • 如何优化此正则表达式?
  • 我需要做什么改变来消除星号通过

    你需要将破折号转义。如果没有转义,它确实表示一个范围-在你的例子中,
    \)-。
    相当于
    )*+,-。

    如何优化此正则表达式

    我想你的意思是“简化”。我可以看到序列
    [\(\)-.]*?([0-9]{3})
    重复了三次,所以如果你不喜欢匹配的组,那么我宁愿使用

    ^(?=.{10,15}$)([\(\)\-. ]*?[0-9]{3}){3}[0-9]
    

    您还可以将
    [0-9]
    缩短为
    \d

    以下是优化的正则表达式:
    ^(?=.{10,15}$(?=.*((?=(::..[0-9]){10}.$([()\s.-]*[0-9]{3}[()\s.-]*[0-9]{3}[()\s.-]*[0-9]{4}$

    或者更简单一些:
    ^(?=.{10,15}$)(?:[()\s.-]*[0-9]{3}){3}[0-9]$

    不要忘记锚点(
    ^
    行开始和
    $
    行结束),并使用多行选项。在JavaScript中,它将是
    /m
    /^(?=.{10,15}$)(?:[()\s.-]*[0-9]{3}{3}[0-9]$/m


    这是。

    1.避开方括号内的破折号:
    -
    ->
    \-
    。就是这样@idleherb。非常感谢!感谢您花时间回答并解释如何使星号不合格,但您发布的正则表达式似乎对我不起作用。@Bazinga:是的。什么不起作用,什么正则表达式味道/l你在用什么语言?现在看起来不错。我之前复制了它,得到了一个奇怪的位置“(“@Bazinga:哦,对了,我还在编辑宽限期内修复了它。没想到有人会注意到:-)