所以我对Javascript世界非常新.我在代码战中练习,必须分析一个引脚,以确保它只包含数字,并且是4或6个字符.我查看了最聪明的代码,答案是:
function validatePIN(pin) { return /^(\d{4}|\d{6})$/.test(pin) }
我以前从未见过"/ ^(\ d {4} |\d {6})$ /"位.谁能告诉我这是什么叫所以我可以自己研究一下,或者告诉我它是如何工作的细分?
这是一个正则表达式.
当我想尝试找到我需要的表达时,我倾向于使用http://www.regexpal.com/,还有http://regexr.com/来了解它们(以及其他资源).
它是一个正则表达式文字,类似于使用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})$/ }
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位数字符串