我有一个包含英语词典中所有单词的列表(270,000 多个单词)存储在一个名为 theList
的变量中。
我有一个乱序词 word
,我想通过与词表匹配来解读它。
最初,我认为以下代码可以解决问题,但效果并不理想。
var theList; // Contains all the words in the English dictionary.
var word = "iexospensr"; // The word I want to unscramble.
var matches = word.match(new RegExp("^["+word+"]{"+word.length+"}$", "gim"));
我原以为“EXPRESSION”是未加扰的结果,但我却得到了更多的结果(如下所列)。
EERINESSES,EXPRESSERS,EXPRESSION,IRONNESSES,ISOSPORIES,NONPERSONS,NONPROSSES,NOSINESSES,OPENNESSES,OPPRESSION,OPPRESSORS,ORNERINESSES,PENSIEROSO,PEPPERONIS,PERSIENNES,PERPONISES,PIPINESSES,PIXINESSES,,PORINESSES,拥有,拥有,暴露前,准备,准备,准备,先入为主,拘谨,倾向,得体,重振,抑制,抑制,抑制,利血平, react , react ,成熟,柔顺,甜美, Restful ,性感,性感,六纺纱厂
也许,如果我能找到一种方法让正则表达式只考虑字符串 word
中的每个字母一次,而不考虑字母的顺序。所以最终结果将是这些字母组合的数组,而不是排列(我现在拥有的)。
如有任何帮助,我们将不胜感激。
编辑: 我认为要走的路是: 1.找出所有的乱码组合 2. 将它们与单词列表进行匹配以检查有效性
如果您有更好的解决方案(在性能方面),它会有所帮助。
这个问题的最佳解决方案似乎是按字母表和整个单词列表重新排序变位词,并将单词与列表中的每个项目进行匹配。
代码如下:
var textList; // the entire dictionary
var list = textList.match(/^.*$/gim);
var sortedList = [];
list.forEach(function(element, index, array) {
sortedList[index] = element.split("").sort().join("");
});
function unscramble(word)
{
word = word.toUpperCase().split("").sort().join("");
var matches = [];
for (var i = 0; i < list.length; i++) {
if (word.indexOf(sortedList[i]) >= 0) {
if (!matches[list[i].length])
matches[list[i].length] = [];
matches[list[i].length].push(list[i]);
}
}
return matches;
}
最佳答案
我认为更好的方法是不使用正则表达式。相反,它会通过遍历单词的字符并查看该字符是否存在于列表中的单词中,来针对您的乱序单词测试列表中的每个成员。每次它找到一个字符,它就可以将该字符标记为“已使用”。
这是将字符位置标记为“已使用”的内容:
function checkUsed(o, which) {
if (o[which] != null) {
o[which] = 1;
return false;
}
return true;
}
var usedMap = [];
if (checkUsed(usedMap, 5) == false) {
...
}
关于javascript - 正则表达式 (Javascript) - 取一个打乱的单词并找到一个未打乱的匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5924268/