Javascript regex для решения задачи заполнения слов
Я ищу способ автоматического решения головоломок палача.
Допустим, мой вход ___o_ и у меня есть банк слов "llaory", чтобы упростить задачу.
Я просмотрю большой список всех английских слов и использую regex для поиска всего, что совпадает.
То, что у меня есть, работает следующим образом.
import raw from "./static/wordlist.txt";
let reg = new RegExp(
"\\b" +
letters.replace(
/_/g,
`[${bank}]`
) +
"\\b",
"g"
);
fetch(raw)
.then((r) => r.text())
.then((text) => {
if (text.match(reg)) {
console.log(text.match(reg));
}
});
Bank - это слово bank, поэтому в данном случае это llaory.
Результатом являются 2 слова ['alloy', 'alloo'].
Правильный и единственный вариант должен быть alloy, но alloo является вариантом, потому что код не может распознать, что может использоваться только 1 o.
Как сделать так, чтобы regex знал, что букв можно использовать только столько, сколько есть в банке?
Я видел это сообщение Регекс с ограниченным использованием определенных символов (как банк букв в скрэббле) но, похоже, он не работает, когда буква уже присутствует, как показано с ___o_
Вы можете фильтровать слова, которые имеют точную длину, как слово палач, и где каждый символ соответствует слову палач.
const
wordlist = ["monkey", "donkey", "moon", "donut"],
word = "_on___",
filteredWords = wordlist.filter(
(w) =>
w.length === word.length &&
Array.prototype.every.call(w, (ch, i) => ch === "_" || ch === w[i])
);
console.log(filteredWords);
Примечание: Поскольку Array.prototype.every
является общим методом, его можно использовать и со строками.
Совет: Если вы находите Array.prototype.every.call
немного многословным, то вы также можете сделать [].every.call
.