My web application needs to parse numeric ranges in strings that are enclosed by parenthesis. I've never really understood regex properly so I need some assistance. The code below is kind of what I'm looking to do (I'll then split the string on the hyphen and get the min/max values). Obviously the pattern is wrong - the example below alerts "(10-12) foo (5-10) bar" when my desired result is 1 alert saying (10-12) and the next saying (5-10), or better yet those values without the parenthesis if that's possible.
Any assistance is appreciated.
var string = "foo bar (10-12) foo (5-10) bar";
var pattern = /\(.+\)/gi;
matches = string.match(pattern);
for (var i in matches) {
alert(matches[i]);
}
Make your quantifier lazy by adding a ?
after the +
. Otherwise, it will greedily consume as much as possible, from your opening (
to the last )
in the string.
var string = "foo bar (10-12) foo (5-10) bar",
pattern = /\(.+?\)/g,
matches = string.match(pattern);
jsFiddle.
If you don't want to include the parenthesis in your matches, generally you'd use a positive lookahead and lookbehind for parenthesis. JavaScript doesn't support lookbehinds (though you can fake them). So, use...
var string = "foo bar (10-12) foo (5-10) bar",
pattern = /\((.+?)\)/g,
match,
matches = [];
while (match = pattern.exec(string)) {
matches.push(match[1]);
}
jsFiddle.
Also...
i
flag in your regex; you don't match any letters.var
. In your example, matches
will be global.for (in)
to iterate over an array. You should also check that match()
doesn't return null
(if no results were found).The problem is that your regular expression is Greedy, meaning that it will match the first bracket and keep on going till it finds the last bracket. To fix this you have two options, you either add the ?
symbol after the +
to make it non greedy: \(.+?\)
or else, match any character except a closing bracket: \([^)]+\)
.
Both of these regular expressions should do what you need.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With