所以我对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/来了解它们(以及其他资源).
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)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位数字符串