RegEx для совпадающих слов, сформированных только из списка букв - PullRequest
5 голосов
/ 07 мая 2019

Учитывая набор слов, мне нужно знать, какие слова образованы только набором букв.Это слово не может содержать больше букв, чем допустимо, даже если эта буква является частью набора проверки.

Пример:

Char set: a, a, ã, c, e, l, m, m, m, o, o, o, o, t (fixed set)

Words set: mom, ace, to, toooo, ten, all, aaa (variable set)

Результат:

mom = true
ace = true
to = true
toooo = true
ten = false (n is not in the set)
all = false (there is only 1 L in the set)
aaa = false (theres is only 2 A in the set)

Каксгенерировать это регулярное выражение в Javascript?(Чувствительный к регистру не проблема).

Я пробовал этот код без успеха:

var str = "ten"
var patt = new RegExp("^[a, a, ã, c, e, l, m, m, m, o, o, o, o, t]*");
console.log(patt.test(str));

1 Ответ

5 голосов
/ 07 мая 2019

Хотя я чувствую, что эта задача больше подходит для написания кода без использования регулярных выражений.Но я могу подумать, что один подход, который должен работать, заключается в использовании негативного взгляда вперед.

Давайте возьмем ваш набор символов в качестве примера, что ваши разрешенные слова могут иметь следующие буквы и не превышать количество, поскольку они присутствуют вlist.

a, a, ã, c, e, l, m, m, m, o, o, o, o, t

Мы можем написать следующее регулярное выражение, которое использует отрицательный упреждающий запрос, чтобы отбросить строки, которые содержат большее количество символов, чем разрешено согласно указанному выше для каждого символа, и, наконец, захватить слово, используя разрешенный набор символов из 1число символов N, где N - общее количество символов.

^(?!([^a]*a){3})(?!([^ã]*ã){2})(?!([^c]*c){2})(?!([^e]*e){2})(?!([^l]*l){2})(?!([^m]*m){4})(?!([^o]*o){5})(?!([^t]*t){2})[aãcelmot]{1,14}$

Объяснение:

  • ^ - начало строки
  • (?!([^a]*a){3}) - этот отрицательный взгляд отклонит ввод, если число a в строке равно 3 или более, так как общее число a в наборе составляет всего 2.
  • (?!([^ã]*ã){2}) - аналогичноэтот отрицательный взгляд отклонит ввод, если число ã в строке равно 2 или более, поскольку в установленном общем числе ã только один.
  • И таквключено для всех символов
  • [aãcelmot]{1,14} - этот набор символов захватывает разрешенные символы по крайней мере от одного до максимум 14, хотя мы также можем просто написать +, поскольку проверка на максимальное количество разрешенных символов уже выполнена с использованием отрицательногосмотреть в будущее.
  • $ - Конец строки

JS Code Demo,

const arr = ['mom','ace','to','toooo','ten','all','aaa']

arr.forEach(x => console.log(x + " --> " +/^(?!([^a]*a){3})(?!([^ã]*ã){2})(?!([^c]*c){2})(?!([^e]*e){2})(?!([^l]*l){2})(?!([^m]*m){4})(?!([^o]*o){5})(?!([^t]*t){2})[aãcelmot]{1,14}$/.test(x)))
...