Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Regex/Javascript for Matching Values in Parenthesis

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]);
}
like image 592
user949738 Avatar asked Dec 20 '22 22:12

user949738


2 Answers

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...

  • You don't need the i flag in your regex; you don't match any letters.
  • You should always scope your variables with var. In your example, matches will be global.
  • You shouldn't use a for (in) to iterate over an array. You should also check that match() doesn't return null (if no results were found).
like image 80
alex Avatar answered Jan 08 '23 05:01

alex


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.

like image 41
npinti Avatar answered Jan 08 '23 06:01

npinti