ES5正则表达式测试按任意顺序查找一组字符

时间:2018-02-15 08:26:41

标签: javascript regex set character

假设我想在字典中找到一个包含任意顺序的给定字母集的单词。对于我的例子,我的正则表达式字符集包含[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的另一种方法进行比较。

3 个答案:

答案 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