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.

Вернуться на верх