2017-08-14 6 views
2

J'essaie de faire correspondre un modèle attendre un groupe Le modèle que j'essaie de faire correspondre est /\|/g i.e | caractère Exemple - Val 1 | Val 2 | Val3 Cela renverra 2 matchsComment faire correspondre sauf un groupe de capture dans regex PCRE (Php)

Mais je veux sauter | char s'il est à l'intérieur [[]] Exemple - 'Val 1 | [[| ]] | Val 3 '

Ici, je ne veux pas le | char à l'intérieur [[]] à renvoyer.Par conséquent, cela devrait retourner 2 matchs.

J'ai essayé le lookhead négatif mais mon regex ne semble pas fonctionner.

J'ai capturé [[| ]] en utilisant - \[\[.*\|.*\]\] [^(\[\[.*\|.*\]\])] et (?!(\[\[.*\|.*\]\])) ne semble pas me donner le résultat souhaité.

Merci!

Répondre

1

Utilisez un SKIP-FAIL technique:

\[\[.*?]](*SKIP)(*FAIL)|\| 

Voir la regex demo

Détails

  • \[\[.*?]](*SKIP)(*FAIL) - correspond [[, puis tout 0+ caractères, aussi peu que possible, une autre ligne que break chars (ajoutez le modificateur /s pour faire correspondre les lignes), puis ]], puis le (*SKIP)(*FAIL) (ou (*SKIP)(*F) ou (*SKIP)(?!)) omettra le match et fera le moteur regex procéder à la recherche d'un autre | de la fin du match en cours
  • | - ou
  • \| - une pipe | littérale symbole
+0

Ce ne devrait pas être \ [\ [. *? \] \] (* SKIP) (* FAIL) | \ | ? \] \] le rendrait cohérent je suppose. –

+0

']' n'est pas un métacaractère regex spécial, il n'a pas besoin d'être échappé. La meilleure pratique est d'échapper seulement à ce qui doit être échappé. –

+0

Merci pour l'explication! –