2009-12-21 8 views
1

J'ai besoin d'aide concernant l'expression régulière pour trouver un tag/code appelé 'WAITPHOTO' dans un texte de document. En fonction de la présence de la balise WAITPHOTO, je vais entourer le texte d'une image (gauche/droite de l'image).
FYI, Tous les tags commençant par PHOTO seront remplacés par Image lors de l'exécution.Expression régulière, C#

J'ai un texte qui ressemble à:

Steps from the drive lead to a terrace with a stone balustrade and open views. 
Front door and double glazed side window lead to the: 
[PHOTOA] 
This is text for PhotoA as WAITPHOTO code is followed. 
[WAITPHOTO] 
SITTING ROOM: 5.11m x 4.61m. Double glazed patio doors to front  
terrace, with open views across Babbacombe. Double glazed window. Television 
aerial point. One screened radiator. One double radiator. 
[PHOTOB] 
This text is NOT for PhotoB as WAITPHOTO code is not followed. 

Steps from the drive lead to a terrace with a stone balustrade and open views. 
Front door and double glazed side window lead to the: 
[PHOTOC] 
This is text for PhotoC as WAITPHOTO code is followed. 
[WAITPHOTO] 

je dois savoir si un savoir particulier tag d'image. [PHOTOA] est suivi de la balise WAITPHOTO. De même, vous devez vous assurer qu'une étiquette WAITPHOTO particulière est associée à l'étiquette PHOTO actuelle et non aux autres étiquettes PHOTO suivantes.

Quelqu'un peut-il s'il vous plaît me guider une expression régulière pour atteindre ci-dessus.

Merci!

+0

Ai-je bien compris si vous voulez vérifier qu'il n'y a pas d'autres balises PHOTOX après une autre balise PHOTOX sans rencontrer d'abord un WAITPHOTO, c'est-à-dire qu'une balise PHOTOX doit être fermée avec un WAITPHOTO avant que d'autres ne puissent apparaître (une balise PHOTOX ne peut contenir une autre paire PHOTOX-WAITPHOTO) ou le texte n'est pas valide? – Skurmedel

+0

hmm, vous l'avez bien compris partiellement :) Je veux un moyen de savoir si une balise PHOTOX est suivie ou non d'une balise WAITPHOTO Une balise PHOTOX peut toujours être suivie d'une autre "PHOTOX-WAITPHOTO"/"PHOTOX". – iniki

+0

Les étiquettes peuvent-elles apparaître dans un autre texte? Par exemple: Le texte est sympa, le texte est cool Texte [PHOTOA] pour photo a [WAITPHOTO] – Skurmedel

Répondre

1

Cette expression régulière a fonctionné pour moi: (\[PHOTO\w+\])([^\[]+)\[WAITPHOTO\]

Elle regroupe la balise nom de photo et le texte appliqué.

Voici un exemple de la façon de l'utiliser:

string test = @"Steps from the drive lead to a terrace with a stone balustrade and open views. Front door and double glazed side window lead to the: [PHOTOA]This is text for PhotoA as WAITPHOTO code is followed.[WAITPHOTO]SITTING ROOM: 5.11m x 4.61m. Double glazed patio doors to front  terrace, with open views across Babbacombe. Double glazed window. Television aerial point. One screened radiator. One double radiator. [PHOTOB]This text is NOT for PhotoB as WAITPHOTO code is not followed.Steps from the drive lead to a terrace with a stone balustrade and open views. Front door and double glazed side window lead to the: [PHOTOC]This is text for PhotoC as WAITPHOTO code is followed.[WAITPHOTO]"; 
string regex = @"(\[PHOTO\w+\])([^\[]+)\[WAITPHOTO\]"; 
System.Text.RegularExpressions.MatchCollection mc = System.Text.RegularExpressions.Regex.Matches(test, regex); 
foreach (System.Text.RegularExpressions.Match m in mc) 
{ 
    System.Console.WriteLine(m.Value); 
    System.Console.WriteLine("This is the photo name: " + m.Groups[1].Value); 
    System.Console.WriteLine("This is the photo text: " + m.Groups[2].Value); 
} 
+0

Le problème avec cette regex est que si vous avez un [dans le texte de la photo, il ne correspondra pas. –

1

Cela fonctionne pour moi:

(\[PHOTO.\]).*?(?<!\1.*?\[PHOTO.\].*)\[WAITPHOTO\] 

Parce que je crois que les expressions régulières sont souvent "écrivent seulement":

I essayez de faire correspondre un tag [PHOTOX], suivi d'un petit texte si nécessaire (. *?) et d'un [WAITPHOTO] à la fin. Pour répondre à vos besoins j'ai ajouté un lookbehind négatif avant la fin WAITPHOTO qui dit "s'il y a un [PHOTOX] entre l'étiquette de départ et le WAITPHOTO, échouer