我必须确定一个句子中的哪个单词以任何顺序嵌入了字母,但是它们必须连续放置。
例如,使用单词BLABBER
。
假设我需要以任何顺序但连续嵌入的字母找到BAL
。该单词的前三个字母是一个匹配项(因为BLA
具有BAL
的所有字母)。接下来的三个字母LAB
也是一个匹配项。
您可能会认为另一个匹配项是 L 和 A 以及单词中的第三个 B ,但是因为这些字母不是连续,这否是有效的匹配!
有人可以帮我为此创建正则表达式吗?以某种方式编写此函数吗?
答案 0 :(得分:1)
如果您想使用正则表达式,可以通过以下方式将搜索词(“ BLA”)重新格式化为正则表达式:
(?=.?.?B)(?=.?.?L)(?=.?.?A)(?=(...))
这样,您无需写出每个组合。
答案 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;
}