正規表現でこれを完全に行う方法は考えられませんでしたが、これを思いつくことができました: http://jsfiddle.net/T2TMd/2/
jsfiddle は投稿サイズに制限されているため、そこで大きな辞書を作成できませんでした。180,000 語の辞書を使用したより良い例については、こちらを確認してください。
主な機能:
/*
* 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();
});
これは Scrabble で役に立ちます。単語が "D" で始まらなければならない位置にいて、その "D" と並列単語の "R" の間に 2 つのスペースがあるとしますOAEES
。あなたのレターバンク。Dで始まる必要があるため、ビルダーに入れるD,<2>,R,<0-3>
ことができます。次に、銀行からの2文字が必要であり、次にRがあり、最大3文字を使用する必要があります(間に2を使用しているため) D および R)。
ビルダーはレター バンクを使用し、可能な一致をフィルター処理するために使用されるものに変換D,<2>,R,<0-3>
します。^(D)([OAEES]{2})(R)([OAEES]{0,5})$
次に、それらの可能な一致を使用して、レターバンクを使用するキャプチャグループを文字ごとに調べ、見つかったときにその正規表現から文字を削除して、そこよりも多くのレターバンク文字が使用されている場合は一致しないようにします。レターバンクにあります。
ここで上記のシナリオをテストします。