275

I am trying to write a regular expression which returns a string which is between parentheses. For example: I want to get the string which resides between the strings "(" and ")"

I expect five hundred dollars ($500).

would return

$500

Found Regular expression to get a string between two strings in Javascript

I don't know how to use '(', ')' in regexp.

2

10 Answers 10

642

You need to create a set of escaped (with \) parentheses (that match the parentheses) and a group of regular parentheses that create your capturing group:

var regExp = /\(([^)]+)\)/;
var matches = regExp.exec("I expect five hundred dollars ($500).");

//matches[1] contains the value between the parentheses
console.log(matches[1]);

Breakdown:

  • \( : match an opening parentheses
  • ( : begin capturing group
  • [^)]+: match one or more non ) characters
  • ) : end capturing group
  • \) : match closing parentheses

Here is a visual explanation on RegExplained

Sign up to request clarification or add additional context in comments.

16 Comments

+1 Nice, worked like a charm. I would like to add you to add this tinyurl.com/mog7lr3 in your for a visual explanation.
This doesn't work if there are parentheses within the parentheses you want to capture. Such as: "I expect five hundred dollars ($500 (but I know I'll never see that money again))."
This regex works only if matching one instance per sting. Using the global /g flag wont work as expected.
@IanWarburton, matches[0] gives you the full string of characters matched '($500)', while matches[1] gives you just what's in the capturing group. Here is some more info on the return value of regExp.match(). developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
what is the solution if you have multiple strings inside parentheses like below: "I expect (five) hundred dollars ($500)" let's say I want an array of those special strings.
|
44

Try string manipulation:

var txt = "I expect five hundred dollars ($500). and new brackets ($600)";
var newTxt = txt.split('(');
for (var i = 1; i < newTxt.length; i++) {
    console.log(newTxt[i].split(')')[0]);
}

or regex (which is somewhat slow compare to the above)

var txt = "I expect five hundred dollars ($500). and new brackets ($600)";
var regExp = /\(([^)]+)\)/g;
var matches = txt.match(regExp);
for (var i = 0; i < matches.length; i++) {
    var str = matches[i];
    console.log(str.substring(1, str.length - 1));
}

1 Comment

Running that jsperf today in Chrome 59.0.3071, the regex was faster by 8%
26

Simple solution

Notice: this solution can be used for strings having only single "(" and ")" like string in this question.

("I expect five hundred dollars ($500).").match(/\((.*)\)/).pop();

Online demo (jsfiddle)

1 Comment

add optional chaining in case match doesnt exist will return undefined instead of resulting in uncaught exception ("I expect five hundred dollars ($500).").match(/((.*))/)?.pop();
25

To match a substring inside parentheses excluding any inner parentheses you may use

\(([^()]*)\)

pattern. See the regex demo.

In JavaScript, use it like

var rx = /\(([^()]*)\)/g;

Pattern details

  • \( - a ( char
  • ([^()]*) - Capturing group 1: a negated character class matching any 0 or more chars other than ( and )
  • \) - a ) char.

To get the whole match, grab Group 0 value, if you need the text inside parentheses, grab Group 1 value.

Most up-to-date JavaScript code demo (using matchAll):

const strs = ["I expect five hundred dollars ($500).", "I expect.. :( five hundred dollars ($500)."];
const rx = /\(([^()]*)\)/g;
strs.forEach(x => {
  const matches = [...x.matchAll(rx)];
  console.log( Array.from(matches, m => m[0]) ); // All full match values
  console.log( Array.from(matches, m => m[1]) ); // All Group 1 values
});

Legacy JavaScript code demo (ES5 compliant):

var strs = ["I expect five hundred dollars ($500).", "I expect.. :( five hundred dollars ($500)."];
var rx = /\(([^()]*)\)/g;


for (var i=0;i<strs.length;i++) {
  console.log(strs[i]);

  // Grab Group 1 values:
  var res=[], m;
  while(m=rx.exec(strs[i])) {
    res.push(m[1]);
  }
  console.log("Group 1: ", res);

  // Grab whole values
  console.log("Whole matches: ", strs[i].match(rx));
}

5 Comments

This regex is great because it only captures pairs of () and their contents, even when side by side()().
@limitlessloop Since this seems a helpful answer, I also added a new matchAll based JavaScript code demo.
this answer is the best.
How to include parantheses, can you give an example about that too?
@postgresnewbie It is already there, console.log( Array.from(matches, m => m[0]) ); // All full match values. You do not need the group then, and can use var rx = /\([^()]*\)/g;
13

Ported Mr_Green's answer to a functional programming style to avoid use of temporary global variables.

var matches = string2.split('[')
  .filter(function(v){ return v.indexOf(']') > -1})
  .map( function(value) { 
    return value.split(']')[0]
  })

1 Comment

8

Alternative:

var str = "I expect five hundred dollars ($500) ($1).";
str.match(/\(.*?\)/g).map(x => x.replace(/[()]/g, ""));
→ (2) ["$500", "$1"]

It is possible to replace brackets with square or curly brackets if you need

1 Comment

This is broken when str has no brackets
6

For just digits after a currency sign : \(.+\s*\d+\s*\) should work

Or \(.+\) for anything inside brackets

3 Comments

This will work for the sample text, however if another ) appears later in the string like I expect five hundred dollars ($500). (but I'm going to pay). the greediness of the + will capture a lot more.
@Denomales So how would you have it capture both instances of those strings. Ideally I am doing something similar but I would like to have: ($500) and (but I'm going to pay) be matched but in two separates matches rather than being considered a single matched item? Thanks in advance!
(.+) worked for my requirement. Needed to capture stuffs like "Dunhill (Bottle/Packet/Pot/Shot)" and return just "Dunhill"
4

let str = "Before brackets (Inside brackets) After brackets".replace(/.*\(|\).*/g, '');
console.log(str) // Inside brackets

Comments

2
var str = "I expect five hundred dollars ($500) ($1).";
var rex = /\$\d+(?=\))/;
alert(rex.exec(str));

Will match the first number starting with a $ and followed by ')'. ')' will not be part of the match. The code alerts with the first match.

var str = "I expect five hundred dollars ($500) ($1).";
var rex = /\$\d+(?=\))/g;
var matches = str.match(rex);
for (var i = 0; i < matches.length; i++)
{
    alert(matches[i]);
}

This code alerts with all the matches.

References:

search for "?=n" http://www.w3schools.com/jsref/jsref_obj_regexp.asp

search for "x(?=y)" https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/RegExp

Comments

0

Simple: (?<value>(?<=\().*(?=\)))

I hope I've helped.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.