Je veux faire correspondre toutes les chaînes de caractères se terminant par ".htm", sauf si elles se terminent par "foo.htm". Je me débrouille généralement bien avec les expressions régulières, mais les expressions négatives me laissent perplexe. Pourquoi cela ne fonctionne-t-il pas ?
/(?!foo)\.htm$/i.test("/foo.htm"); // returns true. I want false.
Que devrais-je utiliser à la place ? Je pense que j'ai besoin d'un "regard négatif". derrière "(si JavaScript supportait une telle chose, mais je sais qu'il ne le fait pas).
2 votes
Malheureusement, JavaScript ne supporte pas le "lookbehind" dans les expressions régulières.
2 votes
Il est souvent préférable d'avoir une expression régulière plus simple avec une boucle ou deux, plutôt qu'une expression régulière super monstrueuse (d'accord, ce que vous voulez n'est pas super monstrueux, mais le code a tendance à grossir), je dirais même impossible à maintenir.
0 votes
Ce n'est peut-être pas opportun, mais pour expliquer pourquoi cela ne fonctionne pas : Votre regexp n'est pas un 0-width, ce qui signifie qu'en javascript, cela se traduit par "Match '.htm' mais pas s'il commence par 'foo'", puisque ".htm" ne commencera jamais par "foo", cela ne fonctionnera pas. Le lookahead négatif signifie "à ce stade, exclure les correspondances où ce négatif est vrai ici", mais il ne consomme pas réellement la chaîne.