首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ES5 Regex测试按任意顺序查找一组字符

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

Stack Overflow用户
提问于 2018-02-15 08:26:41
回答 3查看 2.6K关注 0票数 0

比如说,我想在字典中找到一个单词,它包含给定的字母集,按任何顺序排列。对于我的例子,regex字符集包含jock。我一直试图创建一个函数,该函数创建一个regex测试,如下所示:

代码语言:javascript
复制
/*
** 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进行比较。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-02-16 23:23:38

纳胡尔的回答把我引向了正确的方向。在前面的尝试中,我尝试传递一个字符串'jock‘作为regex用于匹配字符串的字符模式。只要在字符串中找到字母'j‘、'o’、'c‘、'k’,就可以按字符串的任何顺序找到它们。正如Nahuel所指出的,我不能只接受‘’jock‘字符串并用一个字符类[]包围它,因为regex返回的是TRUE,如果集合中只有一个字符匹配而其他字符不返回。堆栈溢出的Java Regex讨论帮助我重写了函数,构建了一个“正的前瞻性”regex测试。

代码语言:javascript
复制
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测试这里

票数 1
EN

Stack Overflow用户

发布于 2018-02-15 08:52:58

问题是regex返回true,因为它匹配set 可以在regex101上检查的一个字符以匹配整个字符串锚点,并且必须按照@Ryan的建议添加量化符。

代码语言:javascript
复制
^[jackal]+$

注意,a是多余的,因为它在字符集中出现了两次。

票数 1
EN

Stack Overflow用户

发布于 2018-02-15 08:53:05

您可以使用正则表达式

  • ^启动位置
  • []字符类,它可能是空的
  • *是一个贪婪的零量词,直到无限时间(空字符类需要)
  • 字符串的$末端位置

代码语言:javascript
复制
'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']));

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48802817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档