假设我想在字典中找到一个包含任意顺序的给定字母集的单词。对于我的例子,我的正则表达式字符集包含[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的另一种方法进行比较。
答案 0 :(得分:1)
问题是正则表达式返回true,因为它匹配set can be checked on regex101的一个字符以匹配整个字符串锚点,并且必须按照@Ryan的建议添加量词。
^[jackal]+$
请注意a
是多余的,因为它在字符集中出现两次。
答案 1 :(得分:1)
您可以使用带
的正则表达式^
开始职位[]
一个字符类,可能是空的*
一个贪婪的量词,直到无限时间为零(空字符类需要)$
字符串的结束位置
'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']));

答案 2 :(得分:0)
Nahuel的回答引导我朝着正确的方向前进。在我之前的尝试中,我试图传递一串字符'jock'作为正则表达式的字符模式,以便匹配字符串。字母组'j','o','c','k'可以按字符串的任何顺序找到,只要它们在字符串中找到即可。正如Nahuel指出的那样,我不能只取'jock'字符串并用字符类[]包围它,因为即使集合中只有1个字符匹配而其余字符不匹配,正则表达式返回TRUE。这个Java Regex discussion堆栈溢出帮助我重写了我的函数来构建一个'积极前瞻'的正则表达式测试。
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测试here