为了账号安全,请及时绑定邮箱和手机立即绑定

使用 RegEx 在随机字符串中准确查找字母

使用 RegEx 在随机字符串中准确查找字母

慕村9548890 2021-12-02 15:28:37
这里要强调的是这个词准确。这需要适用于任意数量的排列,所以希望我的例子足够清楚。给定一串随机字母,是否有可能(使用 RegEx)匹配给定字符串中的确切数量的字母?因此,如果我有一个str1包含字母的字符串 ( )ABZBABJDCDAZ并且我想匹配字母JDBBAA( str2),我的函数应该返回,true因为str1包含足够多的所有正确字母。但是str1,如果要更改为ABAJDCDA,则该函数将false根据str2需要返回str1至少有2 个字母实例B。这是我到目前为止使用范围的内容:const findLetters = (str1, str2) => {  const regex = new RegExp(`[${str2}]`, 'g')  const result = (str1.match(regex))  console.log(result)}findLetters('ABZBABJDCDAZ', 'JDBBAA')如您所见,它匹配正确的字母,但它匹配它们的所有实例。有什么方法可以使用 RegEx 做我想做的事吗?我在这里关注 RegEx 的原因是因为我需要对这段代码进行高度优化,而到目前为止,我的其他函数使用Array.every()和indexOf()都太慢了。注意:我的函数只需要返回一个true/false值。
查看完整描述

2 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

尝试(这里我们对两个字符串的字母进行排序,然后创建正则表达式A.*A.*B.*B.*D.*J)


const findLetters = (str1, str2) => {

  const regex = new RegExp([...str2].sort().join`.*`)

  return regex.test([...str1].sort().join``)

}


console.log( findLetters('ABZBABJDCDAZ', 'JDBBAA') );

console.log( findLetters('ABAJDCDA', 'JDBBAA') );


查看完整回答
反对 回复 2021-12-02
?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

我不知道正则表达式是否是正确的方法,因为这也会变得非常昂贵。正则表达式很快,但并不总是最快的。


const findLetters2 = (strSearchIn, strSearchFor) => {

  var strSearchInSorted = strSearchIn.split('').sort(function(a, b) {

    return a.localeCompare(b);

  });

  var strSearchForSorted = strSearchFor.split('').sort(function(a, b) {

    return a.localeCompare(b);

  });


  return hasAllChars(strSearchInSorted, strSearchForSorted);

}


const hasAllChars = (searchInCharList, searchCharList) => {

  var counter = 0;

  for (i = 0; i < searchCharList.length; i++) {

    var found = false;

    for (counter; counter < searchInCharList.length;) {

      counter++;

      if (searchCharList[i] == searchInCharList[counter - 1]) {

        found = true;

        break;

      }

    }

    if (found == false) return false;

  }

  return true;

}


// No-Regex solution

console.log('true: ' + findLetters2('abcABC', 'abcABC'));

console.log('true: ' + findLetters2('abcABC', 'acbACB'));

console.log('true: ' + findLetters2('abcABCx', 'acbACB'));

console.log('false: ' + findLetters2('abcABC', 'acbACBx'));

console.log('true: ' + findLetters2('ahfffmbbbertwcAtzrBCasdf', 'acbACB'));

console.log('false: ' + findLetters2('abcABC', 'acbAACB'));

随意测试它的速度并优化它,因为我不是 js 专家。此解决方案应在排序后对每个字符串迭代一次。

查看完整回答
反对 回复 2021-12-02
  • 2 回答
  • 0 关注
  • 198 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信