2009-07-29 5 views
0

Hey les gars, j'essaie de sélectionner une chaîne spécifique d'un texte, mais je ne suis pas un maître des expressions régulières. J'ai essayé dans un sens, et ça part de la ficelle que je veux mais ça correspond à tout ce que je veux aussi.Pourquoi mon expression régulière sélectionne-t-elle tout?

Mon regex:

\nSCR((?s).*)(GI|SI)(.*?)\n 

Texte Je suis correspondant sur. La chaîne du milieu est sélectionnée, elle n'a besoin que du SCR jusqu'à la ligne GI.

Hierbij een test 

SCR 
S09 
/[email protected] 
05FEB 
GI BRGDS OPS 

middle text string (may not selected) 

SCR 
S09 
05FEB 
LHR 
NPVT700 PVT701 30MAR30MAR 1000000 005CRJ FAB1900 07301NCE DD 
/RE.GBFLY/ 
GI BRGDS 

+0

Veuillez ne pas faire référence à votre code Regex en tant que 'he': P – Damien

+3

Oui, ils sont elle ...: P – Kitson

Répondre

1

Pour correspondre à partir d'une ligne commençant par SCR à une ligne commençant par GI ou SI (inclus), vous utilisez l'expression régulière suivante:

(?m:^SCR\n(?:^(?!GI|SI).*\n)*(?:GI|SI).*) 

Cela:

  • Trouvez la début d'une ligne.
  • Faites correspondre SCR et une nouvelle ligne.
  • Correspond à toutes les lignes ne commençant pas par GI ou SI.
  • match la dernière ligne, ce qui nécessite qu'il y ait GI ou SI (évite de correspondre à la fin de la chaîne, s'il n'y a pas GI ou SI.
+0

Je viens de changer un peu mon regex, inspiré par Gumbo. Son expression régulière tient compte du fait que si un groupe n'a pas de ligne «GI» ou «SI», l'expression régulière ne devrait pas correspondre. Maintenant, mon regex et sa deuxième regex sont assez similaires, sauf que le mien utilise l'ancre de début de ligne '^' au lieu de correspondre à une nouvelle ligne. – Blixt

2

Utilisez le quantificateur non gourmand aussi sur la premier quantificateur:

\nSCR((?s).*?)(GI|SI)(.*?)\n 

ou vous pouvez utiliser un negative look-ahead assertion (?!expr) pour capturer seulement les lignes qui ne commencent pas avec soit GI ou SI:

\nSCR((?:\n(?!GI|SI).*)*)\n(?:GI|SI).*\n 
Questions connexes