akinuri
akinuri

Reputation: 12027

Conditional Pattern

I have this text:

<pre id="lyricsText">
__Verse 1
At the starting of the week
At summit talks, you'll hear them speak
It's only Monday

Negotiations breaking down
See those leaders start to frown
It's sword and gun day

__Chorus 1
Tomorrow never comes until it's too late

__Verse 2
You could be sitting taking lunch
The news will hit you like a punch
It's only Tuesday

You never thought we'd go to war
After all the things we saw
It's April Fools' day

__Chorus 1 (R:2)
Tomorrow never comes until it's too late

__Verse 3
You hear a whistling overhead
Are you alive or are you dead?
It's only Thursday

You feel a shaking on the ground
A billion candles burn around
Is it your birthday?

__Chorus 1 (R:2)
Tomorrow never comes until it's too late

__Outro
Make tomorrow come, I think it's too late
</pre>

and I'm trying to capture the headers. To do that I use this pattern:

var headers = /__.*/g;

which works fine, but I want to exclude (R:2) or anything similar to that. I'm using another pattern to capture and modify (R:x) parts:

/(\(R.{0,2}\))/g

I couldn't find a way to make them work together.

How do I write capture /__.*/ and if exist exclude /\(R.{0,2}\)/ ?

FIDDLE

Upvotes: 3

Views: 161

Answers (2)

OGHaza
OGHaza

Reputation: 4795

Assuming that for __Chorus 1 (R:2) you wish to match __Chorus 1, this would do it:

/__(.(?!\(R.{0,2}\)))*/g;

Matches as many characters as it can until the next sequence is (R.{2})

Output on your fiddle:

["__Verse 1", "__Chorus 1", "__Verse 2", "__Chorus 1", "__Verse 3", "__Chorus 1", "__Outro"] 

Upvotes: 4

Kevin Bowersox
Kevin Bowersox

Reputation: 94469

var headers = /__[A-Za-z0-9 ]*(?=\(R:\d\))?/g;

JS Fiddle: http://jsfiddle.net/gjmf4/3/

Upvotes: 2

Related Questions