繁体   English   中英

ES5 Regex测试以任意顺序查找一组字符

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM