比如说,我想在字典中找到一个单词,它包含给定的字母集,按任何顺序排列。对于我的例子,regex字符集包含jock。我一直试图创建一个函数,该函数创建一个regex测试,如下所示:
/*
** 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进行比较。
发布于 2018-02-16 23:23:38
纳胡尔的回答把我引向了正确的方向。在前面的尝试中,我尝试传递一个字符串'jock‘作为regex用于匹配字符串的字符模式。只要在字符串中找到字母'j‘、'o’、'c‘、'k’,就可以按字符串的任何顺序找到它们。正如Nahuel所指出的,我不能只接受‘’jock‘字符串并用一个字符类[]包围它,因为regex返回的是TRUE,如果集合中只有一个字符匹配而其他字符不返回。堆栈溢出的Java Regex讨论帮助我重写了函数,构建了一个“正的前瞻性”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测试这里
发布于 2018-02-15 08:52:58
问题是regex返回true,因为它匹配set 可以在regex101上检查的一个字符以匹配整个字符串锚点,并且必须按照@Ryan的建议添加量化符。
^[jackal]+$注意,a是多余的,因为它在字符集中出现了两次。
发布于 2018-02-15 08:53:05
您可以使用正则表达式
^启动位置[]字符类,它可能是空的*是一个贪婪的零量词,直到无限时间(空字符类需要)$末端位置
'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']));
https://stackoverflow.com/questions/48802817
复制相似问题