Voici une regex qui fonctionne bien dans la plupart des implémentations de regex:
(?<!filename)\.js$
Cela correspond à .js pour une chaîne qui se termine par .js sauf pour filename.js
Javascript n'a pas de regex lookbehind. Quelqu'un est-il capable de créer une expression régulière alternative qui atteint le même résultat et fonctionne en javascript?
Voici quelques réflexions, mais a besoin de fonctions d'assistance. J'espérais y parvenir simplement avec une regex: http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript
javascript
regex
Daniel
la source
la source
(?<=thingy)thingy
pour lookbehind positif et(?<!thingy)thingy
pour lookbehind négative . Maintenant, il les soutient.Réponses:
^(?!filename).+\.js
travaille pour moitesté contre:
Une explication correcte de cette expression régulière peut être trouvée dans Expression régulière pour correspondre à une chaîne ne contenant pas de mot?
Look ahead est disponible depuis la version 1.5 de javascript et est pris en charge par tous les principaux navigateurs
Mis à jour pour correspondre à filename2.js et 2filename.js mais pas à filename.js
(^(?!filename\.js$).).+\.js
la source
a.js
2filename.js
, mais l'expression régulière donnée ici le fait. Un plus approprié serait^(?!.*filename\.js$).*\.js$
. Cela signifie, correspond à tout*.js
sauf*filename.js
.EDIT: À partir d'ECMAScript 2018, les assertions de recherche (même illimitées) sont prises en charge de manière native .
Dans les versions précédentes, vous pouvez faire ceci:
Cela fait explicitement ce que fait implicitement l'expression lookbehind: vérifiez chaque caractère de la chaîne si l'expression lookbehind plus le regex après elle ne correspondent pas, et seulement alors autorisez ce caractère à correspondre.
Une autre modification:
Cela me fait mal de dire (d'autant plus que cette réponse a été tellement votée) qu'il existe un moyen beaucoup plus simple d'atteindre cet objectif. Il n'est pas nécessaire de vérifier l'anticipation de chaque caractère:
fonctionne aussi bien:
la source
2filename.js
. Mon regex correspond exactement aux mêmes cas que votre exemple de regex.^(?!.*filename\.js$).*\.js$
ça marcherait. Essayer de penser à des situations où le ncgroup pourrait encore être nécessaire ...Supposons que vous vouliez tout trouver
int
non précédé deunsigned
:Avec prise en charge du look-behind négatif:
Sans prise en charge de la rétroaction négative:
Fondamentalement, l'idée est de saisir n caractères précédents et d'exclure la correspondance avec une anticipation négative, mais également de faire correspondre les cas où il n'y a pas de n caractères précédents. (où n est la longueur du regard derrière).
Donc le regex en question:
se traduirait par:
Vous devrez peut-être jouer avec la capture de groupes pour trouver l'endroit exact de la chaîne qui vous intéresse ou vous ne voulez pas remplacer une partie spécifique par autre chose.
la source
(?<!barna)(?<!ene)(?<!en)(?<!erne) (?:sin|vår)e?(?:$| (?!egen|egne))
à(?!barna).(?!erne).(?!ene).(?!en).. (?:sin|vår)e?(?:$| (?!egen|egne))
qui fait l'affaire pour mes besoins. Fournir simplement cela comme un autre scénario «réel». Voir le lien((?!unsigned ).{9}|^.{0,8})int
Si vous pouvez regarder en avant mais en arrière, vous pouvez d'abord inverser la chaîne, puis faire une anticipation. Il faudra bien sûr faire un peu plus de travail.
la source
C'est une solution équivalente à la réponse de Tim Pietzcker (voir aussi les commentaires de la même réponse):
Cela signifie, match
*.js
sauf*filename.js
.Pour arriver à cette solution, vous pouvez vérifier quels modèles le lookbehind négatif exclut, puis exclure exactement ces modèles avec une anticipation négative.
la source
Vous trouverez ci-dessous un aperçu positif de l'alternative JavaScript montrant comment capturer le nom de famille des personnes avec `` Michael '' comme prénom.
1) Compte tenu de ce texte:
obtenir un tableau de noms de famille de personnes nommées Michael. Le résultat devrait être:
["Jordan","Johnson","Green","Wood"]
2) Solution:
3) Vérifier la solution
Démo ici: http://codepen.io/PiotrBerebecki/pen/GjwRoo
Vous pouvez également l'essayer en exécutant l'extrait ci-dessous.
la source