[英]ES5 Regex test find a set of characters in any order
假设我想在字典中找到一个包含任意顺序给定字母的单词。 对于我的示例,我的正则表达式字符集包含[jock]。 我一直在尝试创建一个函数来创建这样的正则表达式测试:
/*
** Function: Take an array of 2 strings. Return TRUE if all letters
** of 2nd string are within 1st string, letters can be any order,
** case-sensitivity does not matter.
**
** @param {array} where arr[0] word to check, arr[1] string of characters
** @returns {array}
*/
function matchAllLetters(arr) {
'use strict';
// flags: i - case insensitive, g - global match
var pattern = new RegExp("[" + arr[0] + "+]", "ig");
return ( pattern.test( arr[1] ) );
}
matchAllLetters(['jackal','jock']); //true, s/b false
我知道除了使用RegExp可以解决此问题以外,还有其他方法,但是我想使用RegExp解决此问题,以便可以将RegExp与JSPerf的另一种方法进行比较。
问题在于正则表达式返回true,因为它与set的一个字符匹配, 可以在regex101上进行检查以匹配整个字符串锚点,并且必须按照@Ryan的建议添加量词。
^[jackal]+$
请注意, a
是多余的,因为它在字符集中出现了两次。
您可以将正则表达式与
^
开始位置 []
字符类,可能为空 *
从零开始直到无限时间的贪婪量词(空字符类需要) $
字符串的结束位置 'use strict'; function matchAllLetters(arr) { var pattern = new RegExp("^[" + arr[0] + "]*$", "ig"); return pattern.test(arr[1]); } console.log(matchAllLetters(['jackal', 'jock'])); console.log(matchAllLetters(['', ''])); console.log(matchAllLetters(['jackal', 'jack']));
Nahuel的回答将我引向正确的方向。 在较早的尝试中,我尝试将字符串“ jock”作为字符模式传递给正则表达式以匹配字符串。 字母“ j”,“ o”,“ c”,“ k”的集合可以按字符串的任何顺序找到,只要在字符串中找到它们即可。 正如Nahuel指出的那样,我不能只接受'jock'字符串并用字符类[]包围它,因为即使集合中只有1个字符匹配,而其余字符都不匹配,则regex返回TRUE。 关于堆栈溢出的Java Regex讨论帮助我重写了函数,以构建“正向超前”正则表达式测试。
function matchAllLetters(arr) {
var len= arr[1].length;
var lookahead = [];
for (var i = 0; i < len; i++) {
lookahead += "(?=.*" + arr[1].charAt(i) + ")";
}
var pattern = new RegExp(lookahead, "i");
return ( pattern.test( arr[0] ) );
}
该功能按预期工作。 但是如上所述,整个目的是查看Regex是否以这种方式比其他方法更快地进行模式匹配。 对于那些感兴趣的人,可以在这里找到我的JSPerf测试
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.