7
votes

Regex Lookahead commander

Je suis assez décent avec des expressions régulières, et maintenant j'essaie une fois de plus comprendre de comprendre des assertions de regard sur la lunette et des regards. Ils ont surtout un sens, mais je ne suis pas tout à fait sûr de la manière dont la commande affecte le résultat. Je regarde Ce site qui place les regards avant l'expression et les regards après le expression. Ma question est que cela change-t-il quelque chose? Une réponse récente ici sur Ainsi a placé le lookahead avant l'expression qui conduit à ma confusion.


0 commentaires

3 Réponses :


1
votes

1 (? = abc) code> signifie - recherchez 1 code> et correspondez (mais ne capture pas) abc code> APR. (? signifie - Match (mais ne capture pas) ABC code> avant l'emplacement actuel et continuer à correspondre à 1 code>. de
Donc, normalement, vous placez le lookahead après l'expression et la lunette d'oeil devant elle.

Lorsque nous placons une lunette d'oeil après l'expression, nous sommes revérifiez la chaîne que nous avons déjà assortie forte>. Ceci est courant lorsque vous avez des conditions complexes (vous pouvez y réfléchir comme le et code> des regexs). Par exemple, jetez un coup d'œil à cette réponse récente par Daniel Brückner : P>

.&.(?<! & )


2 commentaires

[^] & [^] est probablement plus facile à comprendre que . (? .


Cela ne correspondra pas à «Ceci» alors que la version de la lunette sera. Un équivalent valide aurait été: \ s & | & \ s



4
votes

Il est plus facile de montrer dans un exemple que d'expliquer, je pense. Profitons de cette regex:

(?<=\d)(?=(.)\1)(?!p)\w(?<!q)


0 commentaires

11
votes

Lorsque des didacticiels introduisent des recherches sur les regards, ils ont tendance à choisir le cas d'utilisation le plus simple pour chacun. Donc, ils utiliseront des exemples tels que (? ('B' non précédé de 'A') ou q (? = U) ('Q' suivi de 'U'). Il s'agit simplement d'éviter d'encombrer l'explication avec des détails distrayants, mais il a tendance à créer (ou à renforcer) l'impression que les regards et les regards regardent sont censés apparaître dans un certain ordre. Il m'a fallu un peu de temps pour passer de cette idée et j'ai vu plusieurs autres affligés à cela.

Essayez d'examiner des exemples plus réalistes. Une question qui attire beaucoup implique la validation des mots de passe; Par exemple, en veillant à ce que un nouveau mot de passe est d'au moins six caractères et contient au moins une lettre et un chiffre. Une façon de faire ce serait: xxx

la classe de caractères [a-za-z0-9] {6,} pourrait correspondre à toutes les lettres Ou tous les chiffres, vous utilisez donc les regards pour vous assurer qu'il y a au moins un de chacun. Dans ce cas, vous devez faire les lookaheads premier , car les parties ultérieures de la regex doivent être capables d'examiner la chaîne entière.

Pour un autre exemple, supposons que vous ayez besoin de besoin Pour trouver toutes les occurrences du mot "là", à moins que cela ne soit précédé d'une citation. La regex évidente pour cela est (? , mais si vous recherchez un gros corpus, cela pourrait créer un problème de performance. Comme écrit, cette réégalité fera la vedette négative à chaque position dans le texte, et seulement lorsque cela réussit-il vérifier le reste de la regex.

Chaque moteur de regex a ses propres forces et faiblesses, mais une chose qui est vraie de tous d'entre eux est qu'ils sont plus rapides de trouver des séquences fixes de caractères littéraux que toute autre chose - plus la séquence est longue, mieux c'est. Cela signifie qu'il peut être considérablement plus rapide de faire le lookbehind dernier , même si Cela signifie assortir le mot deux fois: xxx

de sorte que la règle régissant le placement des regards de surveillance est qu'il n'y a pas de règle; vous les mettez partout où ils ont le plus de sens dans chaque cas.


2 commentaires

Je tiens à vous assurer de bien comprendre votre mot de passe correctement: d'abord, il recherche une chaîne qui a tous des caractères alphabétiques. Ensuite, il cherche une chaîne qui a des chiffres. Une fois que cela a trouvé un match pour ceux-ci, il commence la regex standard (c'est-à-dire non-surveillant) de la Début du match? C'est là que je suis le plus confus: si vous avez utilisé des regards à la place, vous finiriez par faire correspondre la regex standard à la fin de la chaîne? Pourquoi un lookbehind ne fait-il pas la même chose? à partir de là, il vérifie si les caractères suivants sont d'au moins 6 caractères alphanumériques.


Ohhhhh, je pense que je l'obtiens maintenant. Un lookedehind rechercherait dans l'autre sens: il ressemblerait derrière (facepalm) le match de [a-za-z0-9] {6,} . Qu'est-ce que derrière le Démarrer de [a-za-z0-9] {6,} n'est pas pertinent.