#javascript #regex
#javascript #регулярное выражение
Вопрос:
У меня очень длинный список слов blacklist = ["sandwhich", "banana", "cheese"...]
, и я внедряю систему для проверки, не содержит ли текст эти слова в качестве подстрок.
То, что я делаю, это:
/*
* Determine if a given text contains invalid words
* @param {string} text
**/
isInvalid(text) {
return (
this.blacklist.filter((word) => new RegExp(word, "i").test(text)).length >
0
);
}
Итак, если я протестирую метод с:
myFilter.isInvalid("I love bananas")
возвращает true .
Но, если я попытаюсь с:
myFilter.isInvalid("I love banaaaaaanaaas"); // <- Multiple vowels
оно возвращает false … и мне нужно true.
Есть ли какой-либо способ добиться этого?
Спасибо.
Комментарии:
1. Что такое
blacklist
? Не уверен, как вы ожидаете, что это будет правдой.2. черный список = [«сандвич», «банан», «сыр» …]
3. Таким образом, вам придется написать reg exp, который говорит «один или несколько раз» для каждой буквы, поскольку это не простой текстовый поиск
4. @Raul …
this.blacklist.filter( ... ).length > 0
лучше переписать вthis.blacklist.some( ... )
Ответ №1:
Если вам нужно регулярное выражение, которое является этим /b a n a n a s /
, вы, вероятно, можете достичь этого, создав этот шаблон.
const word = 'bananas'
// add a ` ` after each character in the string
const pattern = word.split('').map(char => char ' ').join('') // "b a n a n a s "
Означает, что предыдущий символ повторяется с вхождением >= 1
new RegExp(pattern, 'i').test('banaaaaaanaaas') // true
Однако, если вы хотите, чтобы повторялись только гласные, вам просто нужно проверить, является ли символ одной из гласных.
const vowels = ['a', 'e', 'i', 'o', 'u']
const word = 'bananas'
// add a ` ` after each vowel in the string
const pattern = word
.split('')
.map(char => vowels.indexOf(char) > -1 ? char ' ' : char)
.join('') // "ba na na s"
Комментарии:
1. … не было ли намного проще, чтобы создать строку шаблона регулярного выражения, использовать
RegExp
сам (подобный/[aeiou]/ig
) в сочетании со строковымreplace
улучшением.2. @Raul Первый не просто повторяет гласные, он повторяет каждый символ. Что вы пытаетесь протестировать?
Ответ №2:
Наиболее простым подходом может быть создание регулярного выражения (из каждого занесенного в черный список слова), которое распознает любую гласную в таком слове и переписывает каждую гласную таким образом, чтобы в шаблоне регулярных выражений эта самая гласная искалась либо как один, либо как много, а также могла использоваться RegExp
функцией…
console.log(
'bananas'.replace((/[aeiou]/ig), (match => `${ match } `))
);
console.log(
RegExp('bananas'.replace((/[aeiou]/ig), (match => `${ match } `)), 'i')
);
.as-console-wrapper { min-height: 100%!important; top: 0; }
… метод, который реализует вышеуказанное, может быть назван createVowelSequenceRegex
и использован соответствующим образом уже существующим методом проверки ( isInvalid
) …
function createVowelSequenceRegex(text) {
return RegExp(text.replace((/[aeiou]/ig), (match => `${ match } `)), 'i');
}
const sampleText = 'I love banaaaaaanaaas';
console.log(
createVowelSequenceRegex("bananas"),
createVowelSequenceRegex("bananas").test(sampleText)
);
function isInvalid(text) {
return (
blacklist.some(word =>
createVowelSequenceRegex(word).test(text)
)
);
}
const blacklist = ["sandwhich", "banana", "cheese"];
console.log(
'isInvalid("I love bananas") ?',
isInvalid("I love bananas")
);
console.log(
'isInvalid("I love banaaaaaanaaas") ?',
isInvalid("I love banaaaaaanaaas")
);
.as-console-wrapper { min-height: 100%!important; top: 0; }