Javascript 这是什么代码/^(\d{4}|\d{6})$/
所以我对Javascript世界非常陌生。我在练习代码战,必须分析pin码,以确保它只包含数字,并且是4或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})$/”位。有谁能告诉我这叫什么,这样我就可以自己研究它,或者给我一个它是如何工作的分解图吗?这是一个正则表达式 当我想尝试并找到所需的表达式时,我倾向于使用它,这也是学
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视为常量,而使用
将regex实例的生命周期管理留给您 文字表示法是编译的,并暗示一个常量正则表达式,而构造函数版本是从字符串重新解析的,因此文字可以更好地优化/缓存。注意:通过在变量中缓存新的正则表达式,您可以获得基本相同的效果,但是文本的正则表达式是在JIT步骤中缓存的- 换句话说,使用正则表达式文字可以避免潜在的性能缺陷: 示例:newregexp()
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})$/ }
^
和$
适用于每个备选方案(因为/^\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})$/
}