180 votes

quelle est la différence entre ?:, ?! et ?MD en regex?

J'ai cherché le sens de ces expressions, mais ne pouvait pas comprendre la nature exacte de differnce entre eux. C'est ce qu'ils disent:

  • ?: Correspondent à l'expression, mais ne pas le capturer.
  • ?= Correspondent à un suffixe, mais de l'exclure de la capture.
  • ?! Match si le suffixe est absent.

J'ai essayé à l'aide de ces simples RegEx et a obtenu des résultats semblables pour tous. exemple: voici les 3 expressions donnent des résultats très similaires.

  • [a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?!\.[a-zA-Z0-9]+)*
  • [a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?=\.[a-zA-Z0-9]+)*
  • [a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9]+)*

239voto

sepp2k Points 157757

La différence entre ?= et ?! , c'est que la première nécessite l'expression de match et ce dernier l'oblige à ne pas correspondre. Par exemple a(?=b) correspondra à la "a", "ab", mais pas le "a" en "ac". Alors qu' a(?!b) correspondra à la "une" en "ac", mais pas le "a", "ab".

La différence entre ?: et ?= que ?= exclut l'expression de l'ensemble du match alors qu' ?: juste ne pas créer une capture d'un groupe. Ainsi, par exemple, a(?:b) correspondra à la "ab" dans "abc", tandis que d' a(?=b) ne correspondre à la "une" dans "abc". a(b) correspondent à la "ab" dans "abc" et de créer une capture contenant le "b".

130voto

anubhava Points 172509
<pre><code></code><p><a href="http://www.regular-expressions.info/lookaround.html">http://www.regular-expressions.info/lookaround.html</a> pour un très bon tutoriel et des exemples sur lookahead dans des expressions régulières.</p></pre>

8voto

lanzz Points 19475

Essayez de correspondance foobar contre celles-ci:

/foo(?=b)(.*)/
/foo(?!b)(.*)/

La première regex match et sera de retour "bar" comme premier submatch - (?=b) correspond au 'b', mais ne le consomme pas, de le laisser pour la suite de parenthèses.

La deuxième regex ne correspondent PAS, parce qu'il s'attend à "foo" pour être suivi par quelque chose de différent de "bar".

(?:...) a exactement le même effet que la simple (...), mais il n'en revient pas de la partie en tant que submatch.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X