inutan
inutan

Reputation: 10888

Regular Expression, C#

I need help regarding Regular Expression to find a tag/code called 'WAITPHOTO' in a document text. Depending on the presence of WAITPHOTO tag, I will be wrapping text around an Image(left/right of image).
FYI, All the tags starting with PHOTO will be replaced by Image at run-time.

I have some text that looks like:

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]

I need to find out if a particular Image tag viz. [PHOTOA] is followed by WAITPHOTO tag. Also, need to ensure that a particular WAITPHOTO tag is associated with current PHOTO tag and not with the some other following PHOTO tags.

Can anyone please guide me a regular expression to achieve above.

Thank you!

Upvotes: 1

Views: 441

Answers (2)

Benjamin Podszun
Benjamin Podszun

Reputation: 9837

This works for me:

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

Because I believe that regular expressions are often "write only":

I try to match a [PHOTOX] tag, followed by as little text as necessary (.*?) and a [WAITPHOTO] at the end. To fulfill your need I added a negative lookbehind before the ending WAITPHOTO that says "if there's a [PHOTOX] between the starting tag and the WAITPHOTO, fail.

Upvotes: 1

Matt Ellen
Matt Ellen

Reputation: 11612

This regular expression worked for me: (\[PHOTO\w+\])([^\[]+)\[WAITPHOTO\]

It groups the photo's name tag and the text applied to it.

Here's an example of how to use it:

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);
}

Upvotes: 1

Related Questions