Alex Wulff Alex Wulff - 7 months ago 12
Javascript Question

Get Array of Strings In Between Two Strings with Javascript

This question has been asked a few times before, here's an example. However, the question linked only asks about getting one string out of the result. The text I would like to parse has many different instances of the trailing and leading strings, and thus the code below does not work:

test.match("SomeString(.*)TrailingString");


As shown in this fiddle. I will show you the intended result below:

If I were to have a string composed of the following elements
STARTINGTEXTText I wantENDINGTEXT Text I don't want STARTINGTEXTMore text I wantENDINGTEXT Text I don't want


I would like to have a function that I can pass in the arguments
STARTINGTEXT
and
ENDINGTEXT
and it would return an array with
"Text I want"
and
"More text I want"


Thanks!

EDIT - This is a Pebble Application so JQuery isn't an option.

This similar thing has been done in Objective-C:

-(NSMutableArray*)stringsBetweenString:(NSString*)start andString:(NSString*)end
{

NSMutableArray* strings = [NSMutableArray arrayWithCapacity:0];

NSRange startRange = [self rangeOfString:start];

for( ;; )
{

if (startRange.location != NSNotFound)
{

NSRange targetRange;

targetRange.location = startRange.location + startRange.length;
targetRange.length = [self length] - targetRange.location;

NSRange endRange = [self rangeOfString:end options:0 range:targetRange];

if (endRange.location != NSNotFound)
{

targetRange.length = endRange.location - targetRange.location;
[strings addObject:[self substringWithRange:targetRange]];

NSRange restOfString;

restOfString.location = endRange.location + endRange.length;
restOfString.length = [self length] - restOfString.location;

startRange = [self rangeOfString:start options:0 range:restOfString];

}
else
{
break;
}

}
else
{
break;
}

}

return strings;

}

Answer

If you would prefer a RegExp solution, you could do something like this:

var test = "STARTINGTEXTText I wantENDINGTEXT Text I don't want STARTINGTEXTMore text I wantENDINGTEXT Text I don't want";
var matches = test.match(/STARTINGTEXT(.*?)ENDINGTEXT/g);

The key to this is the "g" (or global) flag, and the non-greedy repeat operator "*?". See this link for an explanation of the "g" flag and the non-greedy operator.

Here is a modification of your fiddle: link. I changed it so that the alert would show a stringified JSON of the results, so that you could see it matching both strings.

Comments