我想不出在正则表达式中完全做到这一点的方法,但我想出了这个:http: //jsfiddle.net/T2TMd/2/
由于 jsfiddle 仅限于帖子大小,因此我无法在那里制作更大的字典。在此处查看使用 180k 单词词典的更好示例。
主功能:
/*
* filter = regex to filter/split potential matches
* bank = available letters
* groups = capture groups that use the bank
* dict = list of words to search through
*/
var matchFind = function(filter, bank, groups, dict) {
var matches = [];
for(var i=0; i < dict.length; i++) {
if(dict[i].match(filter)){
var fail = false;
var b = bank;
var arr = dict[i].split(filter);
//loop groups that use letter bank
for(var k=0; k<groups.length && !fail; k++) {
var grp = arr[groups[k]] || [];
//loop characters of that group
for(var j=0; j<grp.length && !fail; j++) {
var regex = new RegExp(b);
var currChar = grp.charAt(j);
if(currChar.match(regex)) {
//match found, remove from bank
b = b.replace(currChar,"");
} else {
fail = true;
}
}
}
if(!fail) {
matches.push(dict[i]);
}
}
}
return matches;
}
用法:
$("#go").click( function() {
var f = new RegExp($("#filter").val());
var b = "["+$("#bank").val().replace(/[^A-Za-z]+/g,"").toUpperCase()+"]";
var g = $("#groups").val().replace(/[^0-9,]+/g,"").split(",") || [];
$("#result").text(matchFind(f,b,g,dict).toString());
});
为了更容易创建场景,我也创建了这个:
$("#build").click( function() {
var bank = "["+$("#buildBank").val().replace(/[^A-Za-z]+/g,"").toUpperCase()+"]";
var buildArr = $("#builder").val().split(",");
var groups = [];
var build = "^";
for(var i=0; i<buildArr.length; i++) {
var part = buildArr[i];
if(/\</.test(part)) {
part = "(" + bank + part.replace("<", "{").replace(">", "}").replace("-",",") + ")";
build = build + part;
groups.push(i+1);
} else {
build = build + "("+part+")";
}
}
build = build + "$";
$("#filter").val(build);
$("#bank").val(bank);
$("#groups").val(groups.toString());
$("#go").click();
});
这在拼字游戏中很有用,所以假设你处于一个单词必须以“D”开头的位置,在“D”和平行单词的“R”之间有两个空格,你OAEES
有你的信银行。我可以在构建器中放入D,<2>,R,<0-3>
,因为它必须以 D 开头,然后必须有 2 个来自银行的字母,然后有一个 R,然后我最多可以使用 3 个字母(因为我在两者之间使用了 2 个字母) D 和 R)。
构建器将使用字母库并转换D,<2>,R,<0-3>
为^(D)([OAEES]{2})(R)([OAEES]{0,5})$
用于过滤可能匹配的字母库。然后通过这些可能的匹配,它将逐个字符地查看使用字母库的捕获组,当它找到它们时从该正则表达式中删除字母,这样如果使用的字母库字母多于那里,它将不匹配是在信银行。
在这里测试上述场景。