Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.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
Javascript 这是什么代码/^(\d{4}|\d{6})$/_Javascript_Regex - Fatal编程技术网

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

Javascript 这是什么代码/^(\d{4}|\d{6})$/,javascript,regex,Javascript,Regex,所以我对Javascript世界非常陌生。我在练习代码战,必须分析pin码,以确保它只包含数字,并且是4或6个字符。我看了一下最聪明的代码,答案是: function validatePIN(pin) { return /^(\d{4}|\d{6})$/.test(pin) } 我以前从未见过“/^(\d{4}|\d{6})$/”位。有谁能告诉我这叫什么,这样我就可以自己研究它,或者给我一个它是如何工作的分解图吗?这是一个正则表达式 当我想尝试并找到所需的表达式时,我倾向于使用它,这也是学

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

function validatePIN(pin) {
  return /^(\d{4}|\d{6})$/.test(pin)
}

我以前从未见过“/^(\d{4}|\d{6})$/”位。有谁能告诉我这叫什么,这样我就可以自己研究它,或者给我一个它是如何工作的分解图吗?

这是一个正则表达式


当我想尝试并找到所需的表达式时,我倾向于使用它,这也是学习它们(以及其他资源)。

Javascript RegExp的好参考

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

它是一个,类似于使用
返回新的RegExp('^(\\d{4}\\\d{6})$)。测试(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
所以:
'1234'
'123456'
等都会匹配<代码>'123.00',
'12345'
'abc123'
'1234'
'1234'
将不匹配

正如其他一些人在对JS的评论中所指出的,在JS中使用regex文本时,有几个细微差别需要注意:

  • 文本语法不要求您转义正则表达式模式中的特殊字符。使用RegExp构造函数需要将模式表示为字符串,这反过来需要转义。请注意这两个语法之间的
    \
    差异

  • 使用regex文本将把regex视为常量,而使用
    newregexp()
    将regex实例的生命周期管理留给您

    文字表示法是编译的,并暗示一个常量正则表达式,而构造函数版本是从字符串重新解析的,因此文字可以更好地优化/缓存。注意:通过在变量中缓存新的正则表达式,您可以获得基本相同的效果,但是文本的正则表达式是在JIT步骤中缓存的-

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

    示例:

    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})$/ 
    }
    
    for(变量i=0;i<1000;i++){
    //每次迭代实例化1x正则表达式
    var constructed=newregexp('^(\\d{4}|\\d{6})$'))
    //实例化1个正则表达式
    var literal=/^(\d{4}|\d{6})$/
    }
    

javascript中的正则表达式(regex)验证…@sysk原始版本的意图更为明确(尽管确实相当)。在这种情况下,“效率”是愚蠢的——即使帕伦产生了影响,你也无法匹配千兆字节的管脚。诀窍?它们用于确保
^
$
适用于每个备选方案(因为
/^\d{4}\d{6}$/
匹配
^\d{4}
\d{6}$
)。但没关系,在这种情况下,“清晰”真的是一个品味的问题…@syck很容易假设是这样的,但需要看到。但是,是的,它会让我更高效,“以可读性为代价”(即不那么富于表现力),但阅读regexp的方式是一样的——它是一个regex文本;更具体地说。前导和尾随的
/
不是正则表达式的一部分,而是告诉Javascript将它们之间的所有内容视为一个整体。这是
新正则表达式('^(\d{4}\d{6})$)
@STW:由于缺少转义,您的速记无法使用。您需要
\\d{4}
,因为
\
需要以字符串文字转义。@STW。。。这就是为什么如果你能使用的话,你应该选择简短的语法。这是正确的方法,不是简写。正如其他人所指出的:它不是正则表达式构造函数的简单简写。文字表示法是编译的,并暗示一个常量正则表达式,而构造函数版本是从字符串重新解析的,因此文字可以更好地优化/缓存。注意:通过在变量中缓存新的正则表达式,您可以获得基本相同的效果,但是文本的正则表达式是在JIT步骤中缓存的。To all:为什么这样的问题会得到如此多的投票?即使是最少量的研究也能毫不费力地回答这个问题,伊姆霍。对答案没有冒犯。你们也这么认为吗?文德巴。我认为这个答案实际上涵盖了关于这个问题的所有内容,而且更详细。
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})$/ 
}