如何以任何顺序匹配连续的字母字符串

时间:2018-09-02 03:07:36

标签: javascript regex

我必须确定一个句子中的哪个单词以任何顺序嵌入了字母,但是它们必须连续放置。

例如,使用单词BLABBER

假设我需要以任何顺序但连续嵌入的字母找到BAL。该单词的前三个字母是一个匹配项(因为BLA具有BAL的所有字母)。接下来的三个字母LAB也是一个匹配项。

您可能会认为另一个匹配项是 L A 以及单词中的第三个 B ,但是因为这些字母不是连续,这是有效的匹配!

有人可以帮我为此创建正则表达式吗?以某种方式编写此函数吗?

2 个答案:

答案 0 :(得分:1)

如果您想使用正则表达式,可以通过以下方式将搜索词(“ BLA”)重新格式化为正则表达式:

(?=.?.?B)(?=.?.?L)(?=.?.?A)(?=(...))

Example on regex101

这样,您无需写出每个组合。

答案 1 :(得分:-1)

这是我的解决方案。我意识到的是:单词的长度减去2是连续约束施加的最大匹配数!例如,可以在长度为3的连续段中对“ BLABBER”进行7-2 = 5次测试。

这花了我一段时间来解决,因为javascript的 substring slice 函数根本无法始终按预期运行。 (我简直不敢相信!)

if (allLetters(words[z], val)) { 

....

function allLetters(word, uTxt) {  
    var strLen = word.length;  
    var usrLen = uTxt.length;  
    var hits = false;  
    var wLtrs;  
    var maxLoops =  strLen - (usrLen - 1);  
    var x, y, z;  
    for (x=0; x < maxLoops; x++ ) {       // Loop thru segments of word  
        wLtrs = word.slice(x, x + usrLen);// Grab segment into wLtrs  
        for (y=0; y < usrLen; y++) {      // Check for ALL hits in wLtrs segment  
            z = uTxt.substr(y, 1);  
            z = wLtrs.indexOf(z);         // Is this ltr found in uTxt?  
            if (z != -1) {                // On hit, clip out that char           
                wLtrs = wLtrs.slice(0, z) + wLtrs.slice(z+1);  
            } else {  
                break;  
            }  
        }  
        if (wLtrs.length < 1) {           // If all letters were clipped out  
            hits = true;  
        }  
    }  
    return hits;  
}