这三个正则表达式有效吗?

时间:2013-05-05 22:12:18

标签: javascript regex

  • 正则表达式1:检查3到6之间的数字。

    var myRegxp = /^([0-9]){3,6}$/;
    
  • 正则表达式2:检查3到6之间的数字。

    var myRegxp = /^([0-9_]){3,6}$/;
    
  • 正则表达式3:检查3到6之间以及dash之间的数字。

    var myRegxp = /^([0-9_-]){3,6}$/;
    

问题:

  1. 为什么所有这些都能完美匹配3到6之间的数字?
  2. 第二个和第三个表达式中_(下划线)的含义是什么?

2 个答案:

答案 0 :(得分:5)

每个检查3至6个字符序列。

第一个只允许3位数。

第二个允许3个字符,但除数字外还包括下划线。

第三个字符允许3个字符,但除数字外还包括下划线和短划线。

这些是否“有效”取决于您要完成的任务。破折号对于允许负数是有用的,尽管更严格的正则表达式要求破折号位于第一个位置并且仍然允许3到6个额外的数字。

在回答关于下划线的问题时,它只是第三个正则表达式中的另一个允许字符。这是一个完全合法的正则表达式。


如果你剖析第三个正则表达式,你得到这个:

^表示您要匹配的字符串的开头

()表示在结果中分别捕获parens之间的内容。它不会影响匹配的内容,但会影响匹配结果的返回方式。

[]表示一个字符集,它可以匹配这些括号中的任何内容。

[0-9]表示一系列字符,其中0到9之间的任何字符都构成匹配。

[0-9_-]表示与上面相同的范围,但也包括下划线字符和连字符。

{3,6}表示您希望匹配前一个正则表达式元素的3-6次出现。

$表示字符串

的结尾

因此,在第三个正则表达式中,您正在查找字符串的开头,后跟3-6个字符,可以是数字,下划线或连字符,后跟字符串的结尾。


举例来说:

"444" - matches all three
"-44" - matches the second or third
"_-4" - matches the third
"4"   - matches none

如果你想要一个允许3-6位数并且可以是正数或负数的正则表达式,那么你会使用这样的东西:

/^[+\-]?\d{3,6}$/

这允许使用可选的前导连字符或加号,后跟3-6位数。

答案 1 :(得分:4)

[0-9]表示“09范围内的任何内容”,换句话说,一个数字(也可以用\d表示)。括号表示分组,但这里不需要。 {3,6}表示“前一个必须出现三到六次”。 ^$表示正则表达式必须与整个字符串匹配。

[]中的下划线表示它与数字一起也是有效字符。

它们都是有效的正则表达式,但做了不同的事情:

  • 第一个只允许三到六个数字。
  • 第二个只允许三到六个数字或下划线。
  • 第三个只允许三到六个数字,下划线或连字符。

您要使用哪一个取决于您认为有效的数据。例如,如果连字符无效,则您不想使用第三个连字符,因为它接受连字符。如果你想禁用下划线,那么你最好使用第一个,因为所有其他的都允许下划线。您甚至可以使用正则表达式来允许数字和短划线而不是简单的下划线:/^[\d-]{3,6}$/