2009-01-20 6 views
0

J'ai un texte et je dois prendre le contenu dans un modèle défini. Un contenu entre MARK1 et MARK2 et le contenu après MARK2. Cependant, ces marques peuvent se répéter et j'ai besoin de prendre toutes leurs manifestations. Dans l'exemple ci-dessous:Prendre plusieurs correspondances avec regex séparées par des marques définies

text: "textA textB _MARK1_ textC _MARK2_ textD _MARK1_ textE textF _MARK2_ textG textH textI" 

array(0): _MARK1_ textC _MARK2_ textD 
array(1): textC 
array(2): textD 
array(3): _MARK1_ textE textF _MARK2_ textG textH textI 
array(4): textE textF 
array(5): textG textH textI 

Répondre

1

Ce serait:

/(_MARK1_(.*?)_MARK2_((?:(?!_MARK1_).)*))/g 

Au moins, il fonctionne sur RegEx Coach sur votre cas de test.
Bien sûr, vous devez répéter chaque match.
Notez qu'il peut ne pas fonctionner sur toutes les variantes de regex: JavaScript, par exemple, n'a pas d'assertions lookahead.

+0

parfait. Thats il –

+0

bonne prise, excluant _MARK2__MARK1_, je n'ai pas couvert ce cas dans ma solution – Sparr

0

Je ne pense pas que vous serez en mesure de réaliser cela avec une seule expression. Vous aurez probablement besoin de le décomposer en une expression initiale, puis une boucle pour effectuer une seconde correspondance d'expression avec chaque itération de la première correspondance.

0

Ai-je raté quelque chose ou est-ce que vous cherchez?

/(_MARK1_ (.*?) _MARK2 (.*?))*/ 

J'ai fait quelques hypothèses arbitraires sur la façon dont vous voulez gérer les espaces, que je me rends compte étaient probablement cohérente pour rendre votre exemple le cas plus lisible.

0

Je ne suis pas sûr si vous avez réellement besoin des marques de séparation dans votre tableau. Cette partie semble superflue sauf si vous avez une spécification spécifique pour cela. Cette solution suppose que vous n'en avez pas vraiment besoin. Puisque vous n'avez pas spécifié de langue, qu'en est-il de Perl?

use Data::Dumper; 
my $text = 'textA textB _MARK1_ textC _MARK2_ textD _MARK1_ textE textF _MARK2_ textG textH textI'; 
my @results = $text =~ m/(?<=_MARK1_|_MARK2_)(.*?)(?=_MARK1_|_MARK2_|$)/g; 
print Data::Dumper::Dumper @results; 

Cependant, il n'y a aucune raison d'essayer le cas général avec des expressions régulières. Utilisez un analyseur à la place.

Questions connexes