【问题标题】:Find all matches in a concatenated string of same-length words?在相同长度的单词的串联字符串中查找所有匹配项?
【发布时间】:2013-11-08 03:18:44
【问题描述】:

我有一个很长的 Javascript 字符串,其中包含如下字母:

"aapaalaakaaiartaxealpyaaraa"

这个字符串实际上是一个由 3 个字母组成的链表:"aap","aal","aak","aai", "art", "axe","alp", "yaa" and "raa"

实际上,我有 许多 个这些字符串,它们具有不同的字长,最长可达 2000 个字,所以我需要 最快 的方法来获取所有以某个字符串开头的单词。因此,当搜索所有以"aa" 开头的单词时,它应该返回:

"aap","aal","aak" and "aai"  

有没有办法用正则表达式做到这一点?非常重要的是它只匹配每个 3 字母的单词,因此不应该计算匹配 in between 的单词,因此不应返回 "aar",也不应返回 "yaa""raa" .

【问题讨论】:

  • 你可以每隔 3 个字符拆分一次字符串,循环比较,正则表达式也可以。
  • 你想要最快的方式,还是想要一个正则表达式?这些可能是相互冲突的目标......
  • 不是作业 :) 只是想制作某种拼字游戏

标签: javascript regex string string-matching


【解决方案1】:

简单的方法:

var results = [];

for (var i = 0; i < str.length; i += 3) {
    if (str.substring(i, i + 2) === "aa") {
        results.push(str.substring(i, i + 3));
    }
}

不要问它是否最快——首先检查它是否足够快。 :)

【讨论】:

  • 我看不出正则表达式如何更快。假设没有匹配项(最佳情况),使用 3 和 2 个连续匹配字符集,您仍将进行 n/3 比较。如果每个序列都是匹配的(最坏情况),你仍然只做最好情况的 2 倍。正则表达式不是魔法,它只是一种应用于序列的模式,对吧?
  • @JasonSperske:是的,但正则表达式有时会进行优化。这一切都取决于情况。我还没有对这些进行基准测试,但结果可能出乎意料……
【解决方案2】:

怎么样:

var str = 'aapaalaakaaiartaxealpyaaraa';
var pattern = /^aa/;

var result = str.match(/.{3}/g).filter(function(word) {
  return pattern.test(word);
});

console.log(result); //=> ["aap","aal","aak","aai"]

【讨论】:

  • @JasonSperske:我不明白如何......
  • 你说得对,如果代码正在工作,我在解释这个块是如何工作的时候还有很长的路要走。
【解决方案3】:
"aapaalaakaaiartaxealpyaaraa".replace(/\w{3}|\w+/g,function(m){return m.match(/^aa/)?m+',':','}).split(',').filter(Boolean)

【讨论】:

  • @minitech 因为没有它你会得到["aap", "aal", "aak", "aai", "", "", "", "", "", ""]
  • 只需执行.filter(Boolean) 即可摆脱这些。
  • 啊,抱歉,我说的是.split(/,+/)。但我想这可能会留下预告片。
猜你喜欢
  • 2023-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
  • 2015-05-21
  • 2013-11-01
  • 2017-11-14
  • 1970-01-01
相关资源
最近更新 更多