Javascript - return string between square brackets

JavascriptRegexString

Javascript Problem Overview


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.

Javascript Solutions


Solution 1 - Javascript

Use grouping. I've added a ? to make the matching "ungreedy", as this is probably what you want.

var matches = mystring.match(/\[(.*?)\]/);

if (matches) {
    var submatch = matches[1];
}

Solution 2 - Javascript

Since javascript doesn't support captures, you have to hack around it. Consider this alternative which takes the opposite approach. Rather that capture what is inside the brackets, remove what's outside of them. Since there will only ever be one set of brackets, it should work just fine. I usually use this technique for stripping leading and trailing whitespace.

mystring.replace( /(^.*\[|\].*$)/g, '' );

Solution 3 - Javascript

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

Solution 4 - Javascript

Did you try capturing parens:

("\\[(.*)]");

This should return the pattern within the brackets as a captured match in the returned array

Solution 5 - Javascript

Just use replace and map

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

Solution 6 - Javascript

You can't. Javascript doesn't support lookbehinds.

You'll have to either use a capture group or trim off the brackets.

By the way, you probably don't want a greedy .* in your regex. Try this:

"\\[.*?]"

Or better, this:

"\\[[^\\]]*]"

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBrynJView Question on Stackoverflow
Solution 1 - JavascriptAlex BarrettView Answer on Stackoverflow
Solution 2 - JavascriptStephen SorensenView Answer on Stackoverflow
Solution 3 - JavascriptWiktor StribiżewView Answer on Stackoverflow
Solution 4 - JavascriptennuikillerView Answer on Stackoverflow
Solution 5 - Javascriptivan0biwanView Answer on Stackoverflow
Solution 6 - JavascriptJeremy SteinView Answer on Stackoverflow