这是什么代码?/ ^(\ d {4} |\d {6})$ /

Tuc*_*amp 10 javascript regex

所以我对Javascript世界非常新.我在代码战中练习,必须分析一个引脚,以确保它只包含数字,并且是4或6个字符.我查看了最聪明的代码,答案是:

function validatePIN(pin) {
  return /^(\d{4}|\d{6})$/.test(pin)
}
Run Code Online (Sandbox Code Playgroud)

我以前从未见过"/ ^(\ d {4} |\d {6})$ /"位.谁能告诉我这是什么叫所以我可以自己研究一下,或者告诉我它是如何工作的细分?

Dra*_*18s 26

这是一个正则表达式.

当我想尝试找到我需要的表达时,我倾向于使用http://www.regexpal.com/,还有http://regexr.com/来了解它们(以及其他资源).

  • 这是一个正则表达式*字面*; 进一步来说.前导和尾随的`/`不是正则表达式的一部分,但是告诉Javascript将它们之间的所有内容视为一个.它是`new Regex('^(\ d {4} |\d {6})$')的简写. (13认同)
  • 正如其他人所说:它不是Regex构造函数的简单简写.文字表示法是编译的,意味着一个常量的正则表达式,而构造函数版本是从字符串中重新分析的,因此文字更好地优化/缓存.http://jsperf.com/regexp-literal-vs-constructor/4注意:通过在变量中缓存新的Regex可以获得基本相同的效果,但是在JIT步骤中缓存了文字的一个 (5认同)
  • @STW:由于缺少逃脱,你的速记不起作用.你需要`\\ d {4}`,因为````需要在字符串文字中进行转义. (4认同)
  • 对所有人来说:为什么这样的问题会得到这么多的赞成?愚蠢的研究可以毫不费力地回答这个问题.没有冒犯的答案.你们都这么认为吗? (4认同)
  • @STW ...这就是为什么你应该喜欢短语法,如果你可以使用它.这是正确的方式,而不是速记. (3认同)

STW*_*STW 18

它是一个正则表达式文字,类似于使用return new RegExp('^(\\d{4}|\\d{6})$').test(pin) "文字"部分意味着它是一种在代码中将特定数据类型表示为字符串的方法 - 就像true'true'是不同的,因为一个是布尔文字,另一个是字符串文字.

具体来说,正则表达式^(\d{4}|\d{6})$分解为:

^       a string that starts with...
(       either
  \d    a digit (0-9)...
  {4}   that repeats four times...
|       or
  \d    a digit (0-9)...
  {6}   that repeats six times...
)
$       and then ends
Run Code Online (Sandbox Code Playgroud)

所以:'1234','123456',等会匹配.'123.00','12345','abc123',' 1234',' 1234 '将不匹配.

正如其他几位在关于Draco18s回答的评论中所指出的那样,在JS中使用正则表达式文字时需要注意几个细微差别:

  • 文字语法不要求您在正则表达式模式中转义特殊字符.使用RegExp构造函数要求您将模式表示为字符串,而这又需要转义.注意\两种语法之间的差异.

  • 使用正则表达式文字将正则表达式视为常量,而使用new RegExp()正则表达式实例的生命周期管理由您决定.

    编译文字符号并暗示一个常量正则表达式,而构造函数版本则从字符串中重新分析,因此文字更好地优化/缓存.jsperf.com/regexp-literal-vs-constructor/4注意:通过在变量中缓存新的Regex可以获得基本相同的效果,但是在JIT步骤中缓存了文字的一个 - user120242

    换句话说,使用正则表达式文字可以避免潜在的性能缺陷:

    例:

    for (var i = 0; i < 1000; i++) {
      // Instantiates 1x Regex per iteration
      var constructed = new RegExp('^(\\d{4}|\\d{6})$') 
    
      // Instantiates 1 Regex
      var literal = /^(\d{4}|\d{6})$/ 
    }
    
    Run Code Online (Sandbox Code Playgroud)

  • Vunderbar.我认为这个答案实际上涵盖了*关于这个问题和更详细的问题. (3认同)

use*_*242 14

Javascript RegExp http://www.regular-expressions.info/javascript.html的良好参考

^ beginning of line
\d = all digits
{4} = repetition 4 times
| = "or"
$ end of line
Run Code Online (Sandbox Code Playgroud)

您的示例测试4位数字符串或6位数字符串