Сопоставьте одинаковый начальный и конечный характер строки с помощью Regex

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

var re = /([aeiou]).*\1/;
re.test(str);

Пример ввода:

  • abcde, output - false (Действителен)
  • abcda, output - true (Действительный)
  • aabcdaa, output - true (Действительный)
  • aeqwae, output - true (aeqwae)
  • ouqweru, output - true (ouqweru)

Ответ 1

Вы должны добавить якоря к вашей строке.

Когда у вас есть, например:

aeqwae

Вы говорите, что вывод - правда, но он недействителен, потому что a не совпадает с e. Ну, регулярное выражение просто соответствует предыдущему символу (до e), который является. a Таким образом, совпадение является действительным. Итак, вы получите это:

[aeqwa]e

Строка, заключенная в скобки, является фактическим соответствием и почему она возвращает true.

Если вы измените свое регулярное выражение на это:

/^([aeiou]).*\1$/

Добавляя ^, вы сообщаете ему, что начало совпадения должно быть началом строки, а добавляя $ вы сообщаете ему, что конец совпадения должен быть концом строки. Таким образом, если есть совпадение, вся строка должна совпадать, а это значит, что aeqwae больше не будет aeqwae.

Отличным инструментом для тестирования регулярных выражений является Regex101. Попробуйте!

Примечание. В зависимости от вашего ввода может потребоваться установить глобальный (g) или многострочный (m) флаг. Глобальный флаг не позволяет регулярному выражению возвращаться после первого совпадения. Многострочный флаг заставляет ^ и $ соответствовать началу и концу строки (не строки). Я использовал их оба при тестировании с вашим входом.

Ответ 2

/^([aeiou])[a-z]\1$/

просто небольшое улучшение, чтобы ловить буквы алфавита.

Ответ 3

Просто другая версия ответа @Hristiyan Dodov, которую я написал для прикола.

regex = /^(a|e|i|o|u).*\1$/

const strings = ['abcde', 'abcda', 'aabcdaa', 'aeqwae', 'ouqweru']

strings.forEach((e)=>{
  const result = regex.test(e)
  console.log(e, result)
})