Регулярное выражение Javascript — неопределенное количество гласных в слове

#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; }