Javascript - return string between square brackets

Viewed 101170

I need to return just the text contained within square brackets in a string. I have the following regex, but this also returns the square brackets:

var matched = mystring.match("\\[.*]");

A string will only ever contain one set of square brackets, e.g.:

Some text with [some important info]

I want matched to contain 'some important info', rather than the '[some important info]' I currently get.

6 Answers

To match any text in between two adjacent open and close square brackets, you can use the following pattern:

\[([^\][]*)]
(?<=\[)[^\][]*(?=])

See the regex demo #1 and regex demo #2. NOTE: The second regex with lookarounds is supported in JavaScript environments that are ECMAScript 2018 compliant. In case older environments need to be supported, use the first regex with a capturing group.

Details:

  • (?<=\[) - a positive lookbehind that matches a location that is immediately preceded with a [ char (i.e. this requires a [ char to occur immediately to the left of the current position)
  • [^\][]* - zero or more (*) chars other than [ and ] (note that ([^\][]*) version is the same pattern captured into a capturing group with ID 1)
  • (?=]) - a positive lookahead that matches a location that is immediately followed with a ] char (i.e. this requires a ] char to occur immediately to the right of the current regex index location).

Now, in code, you can use the following:

const text = "[Some text] ][with[ [some important info]";
console.log( text.match(/(?<=\[)[^\][]*(?=])/g) );
console.log( Array.from(text.matchAll(/\[([^\][]*)]/g), x => x[1]) );
// Both return ["Some text", "some important info"]

Here is a legacy way to extract captured substrings using RegExp#exec in a loop:

var text = "[Some text] ][with[ [some important info]";
var regex = /\[([^\][]*)]/g;
var results=[], m;
while ( m = regex.exec(text) ) {
  results.push(m[1]);
}
console.log( results );

Just use replace and map

"blabla (some info) blabla".match(/\((.*?)\)/g).map(b=>b.replace(/\(|(.*?)\)/g,"$1"))
Related