如何使用 Javascript 正则表达式按设定顺序匹配子字符串

How to match substrings in a set order with Javascript Regex

给定单词 'butterfly',我想 return 匹配仅包含来自 'butterfly'.

的 5 个或更多连续字符

测试用例:

  1. 'butter' 会匹配。
  2. 'terfly' 匹配。
  3. 'bXutterfly' 将是一个匹配项(匹配子字符串 'utterfly')
  4. 'butt' 不匹配(少于 5 个连续字符)。

当前代码在不匹配时匹配,因为匹配的 5 个字符不连续,我理解这是因为字符串在 [square braces]:

const str = 'ylfrettbu';
const regex = new RegExp('[butterfly]{5,}', 'gi');
const matched = str.match(regex);

被匹配的字符串必须是动态的因此:new RegExp

ylfrettub 将匹配整个字符串。你可以使用类似 b?u?t?t?e?r?f?l?y?它保持单词的顺序。也许您需要一个解决方案,例如编辑距离、编辑距离或类似的东西。

https://en.wikipedia.org/wiki/Levenshtein_distance

我通过谷歌搜索找到了这个。 https://github.com/schulzch/edit-distance-js

就是returns字的区别

butterfly和butterXfly的编辑距离为1。 butterfly和butterly的编辑距离为1。 butterfly 和 butt 的编辑距离为 5。 butterfly 和 bXuXtXtXeXrfly 的编辑距离为 5。 butterfly和ylfrettub的编辑距离应该是8,我没测试

您可以 运行 在要匹配的字符串上使用以下正则表达式:

(?=(.{5}))

替换为(对于每场比赛)

|

https://regex101.com/r/dDJYh1/1

结果是您可以对正在搜索的实际数据使用的正则表达式。 (butte|utter|tterf|terfl|erfly 对于 butterfly

我刚刚注意到 regex101 没有显示下面的细分,它显示在捕获组的右侧。 右侧 的捕获组是正确的。我不太确定 js 是如何分解的,所以希望其他人可以给你一个更完整的答案或编辑我的。

真的不懂js,但这似乎可以解决问题:

var re = /(.)(?=(.{4}))/g;
var s = "butterfly";

var m = re.exec(s);
do {
    print(m[1]+m[2]);
    m = re.exec(s);
}while(m)