简体   繁体   中英

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

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

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM