46 votes

Regex: Pour extraire une sous-chaîne entre deux balises d'une chaîne

J'ai un fichier au format suivant:

Données données
Les données
[Début]
Données que je veux
[Fin]
Les données

Je voudrais saisir les Data i want entre les balises [Start] et [End] utilisant un RegEx. Quelqu'un peut-il me montrer comment cela pourrait être fait?

63voto

Karl Seguin Points 10566
 \[start\](.*?)\[end\]
 

qui va mettre le texte au milieu d'une capture

23voto

Xenph Yan Points 20883
  \[start\]\s*(((?!\[start\]|\[end\]).)+)\s*\[end\] 

J'espère que cela devrait également supprimer les marqueurs [start] et [end].

5voto

PhaZe Points 61
 $text ="Data Data Data start Data i want end Data";
($content) = $text =~ m/ start (.*) end /;
print $content;
 

J'ai eu un problème similaire pendant un moment et je peux vous dire que cette méthode fonctionne ...

4voto

Jon Ericson Points 9703

Une discussion plus complète des pièges de l'utilisation d'une expression régulière pour trouver la correspondance des balises peut être trouvé à: http://faq.perl.org/perlfaq4.html#How_do_I_find_matchi. En particulier, sachez que l'imbrication des balises vraiment besoin d'un véritable analyseur afin d'être interprétées correctement.

Notez que la sensibilité de cas devra être désactivée afin de répondre à la question comme l'a déclaré. En perl, c'est la que je modificateur:

$ echo "Data Data Data [Start] Data i want [End] Data" \
  | perl -ne '/\[start\](.*?)\[end\]/i; print "$1\n"'
 Data i want

L'autre astuce consiste à utiliser le *? quantificateur qui désactive la gourmandise de la correspondance capturée. Par exemple, si vous avez une non-correspondance [fin] tag:

Data Data [Start] Data i want [End] Data [end]

vous ne voulez probablement pas à la capture:

 Data i want [End] Data

4voto

Daniel Papasian Points 10206

Alors que vous pouvez utiliser une expression régulière pour analyser les données entre l'ouverture et la fermeture des balises, vous devez penser à long et dur de savoir si c'est un chemin que vous voulez aller vers le bas. La raison pour cela est le potentiel de tags à nid: si l'imbrication des balises ne pourrait jamais se produire ou peut jamais arriver, la langue est dit de ne plus être régulier, et les expressions régulières cesser d'être le bon outil pour l'analyser.

De nombreux expression régulière implémentations, comme PCRE ou perl expressions régulières, le soutien mandature qui peut être utilisé pour réaliser cette brusque de l'effet. Mais PCRE (contrairement au perl) ne prend pas en charge illimitée de recul, et cela peut effectivement causer des choses pour casser étranges façons dès que vous avez trop de balises.

Il y a une très fréquemment cité blog qui traite de cette de plus, http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html (google et vérifier le cache actuellement, ils semblent avoir un certain temps d'arrêt)

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