ChatGPT解决这个技术问题 Extra ChatGPT

Regular Expression to get a string between parentheses in Javascript

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

But I'm new with regex. I don't know how to use '(', ')' in regexp

you can use go-oleg's solution below, slightly modified to test for the dollar sign: var regExp = /\(\$([^)]+)\)/;
Would be nice to see what you've tried so far.

u
user1063287

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


+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.
M
Mr_Green

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

Running that jsperf today in Chrome 59.0.3071, the regex was faster by 8%
A
Ali Soltani

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)


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();
W
Wiktor Stribiżew

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


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;
C
Community

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

m
marcofriso

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


This is broken when str has no brackets
P
P0W

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

Or \(.+\) for anything inside brackets


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"
A
Andran

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


A
AJ Dhaliwal
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


B
Bryan Henrique Cruz

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

I hope I've helped.