web-dev-qa-db-fra.com

Correspond au même caractère de début et de fin d'une chaîne avec Regex

J'essaie de faire correspondre le caractère de début et de fin d'une chaîne pour être la même voyelle. Mon expression régulière fonctionne dans la plupart des scénarios, mais échoue dans d'autres:

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

Exemple d'entrée:

  • abcde, sortie - false (valide)
  • abcda, sortie - vrai (valide)
  • aabcdaa, sortie - vrai (valide)
  • aeqwae, sortie - vrai (non valide)
  • ouqweru, sortie - vrai (non valide)
18
Nesh

Vous devez ajouter des ancres à votre chaîne.

Quand vous avez, par exemple:

aeqwae

Vous dites que la sortie est vraie, mais elle n'est pas valide car a n'est pas identique à e. Eh bien, l'expression régulière correspond simplement au caractère précédent (avant e), qui est a. Ainsi, la correspondance est valide. Donc, vous obtenez ceci:

[aeqwa]e

La chaîne entre crochets est la correspondance réelle et pourquoi elle renvoie true.

Si vous changez votre regex en ceci:

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

En ajoutant ^, vous lui dites que le début de la correspondance doit être le début de la chaîne et en ajoutant $ vous lui dites que la fin de la correspondance doit être la fin de la chaîne. De cette façon, s'il y a correspondance, la chaîne entière doit être mise en correspondance, ce qui signifie que aeqwae ne sera plus mis en correspondance.

Un excellent outil pour tester l'expression régulière est Regex101 . Essaie!

Remarque: Selon votre saisie, vous devrez peut-être définir l'indicateur global (g) ou multiligne (m). Le drapeau global empêche l'expression régulière de revenir après la première correspondance. Le drapeau multiligne fait ^ et $ correspond au début et à la fin de la ligne (pas la chaîne). J'ai utilisé les deux lors des tests avec votre entrée.

40
Hristiyan Dodov

Juste une version différente de la réponse @Hristiyan Dodov que j'ai écrite pour le plaisir.

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)
})
3
Pablo
/^([aeiou])[a-z]\1$/

juste un peu d'amélioration, pour attraper les lettres de l'alphabet.

0
geekme