当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《这是什么代码?/^(\d{4}|\d{6})$/》经验,为你挑选了3个好方法。

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

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

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



1> Draco18s..:

这是一个正则表达式.

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


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

2> STW..:

它是一个正则表达式文字,类似于使用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

所以:'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})$/ 
}


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

3> user120242..:

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

^ beginning of line
\d = all digits
{4} = repetition 4 times
| = "or"
$ end of line

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

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有