Хотя я чувствую, что эта задача больше подходит для написания кода без использования регулярных выражений.Но я могу подумать, что один подход, который должен работать, заключается в использовании негативного взгляда вперед.
Давайте возьмем ваш набор символов в качестве примера, что ваши разрешенные слова могут иметь следующие буквы и не превышать количество, поскольку они присутствуют в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)))