JavaScript Regex Global Match Groups

JavascriptRegexPattern Matching

Javascript Problem Overview


Update: This question is a near duplicate of this

I'm sure the answer to my question is out there, but I couldn't find the words to express it succinctly. I am trying to do the following with JavaScript regex:

var input = "'Warehouse','Local Release','Local Release DA'";
var regex = /'(.*?)'/g;

console.log(input.match(regex));

// Actual:
// ["'Warehouse'", "'Local Release'", "'Local Release DA'"]

// What I'm looking for (without the '):
// ["Warehouse", "Local Release", "Local Release DA"]

Is there a clean way to do this with JavaScript regex? Obviously I could strip out the 's myself, but I'm looking for the correct way to caputre globally matched groupings with regex.

Javascript Solutions


Solution 1 - Javascript

To do this with a regex, you will need to iterate over it with .exec() in order to get multiple matched groups. The g flag with match will only return multiple whole matches, not multiple sub-matches like you wanted. Here's a way to do it with .exec().

var input = "'Warehouse','Local Release','Local Release DA'";
var regex = /'(.*?)'/g;

var matches, output = [];
while (matches = regex.exec(input)) {
    output.push(matches[1]);
}
// result is in output here

Working demo: http://jsfiddle.net/jfriend00/VSczR/


With certain assumptions about what's in the strings, you could also just use this:

var input = "'Warehouse','Local Release','Local Release DA'";
var output = input.replace(/^'|'$/, "").split("','");

Working demo: http://jsfiddle.net/jfriend00/MFNm3/


Note: With modern Javascript engines as of 2021, you can use str.matchAll(regex) and get all matches in one function call.

Solution 2 - Javascript

There is an ECMAScript proposal called String.prototype.matchAll() that would fulfill your needs.

Solution 3 - Javascript

Not very generic solution since lookbehind isn't supported in Javascript but for given input this regex should work:

m = input.match(/([^',]+)(?=')/g);//=> ["Warehouse", "Local Release", "Local Release DA"]

Solution 4 - Javascript

String.prototype.matchAll is now well supported in modern browsers as well as Node.js. This can be used like so:

const matches = Array.from(myString.matchAll(/myRegEx/g)).map(match => match[1]);

Note that the passed RegExp must have the global flag or an error will be thrown.

Conveniently, this does not throw an error when no matches are found as .matchAll always returns an iterator (vs .match() returning null).


For this specific example:

var input = "'Warehouse','Local Release','Local Release DA'";
var regex = /'(.*?)'/g;

var matches = Array.from(input.matchAll(regex)).map(match => match[1]);
// [ "Warehouse", "Local Release", "Local Release DA" ]

Solution 5 - Javascript

Try something like input.replace(regex, "$1") to get the results of your capture group.

Solution 6 - Javascript

With es2020 you can use matchAll:

var input = "'Warehouse','Local Release','Local Release DA'";
var regex = /'(.*?)'/g;

const match_all = [...input.matchAll(regex)];

If you're using typescript, don't forget to set it in tsconfig.json:

"compilerOptions": {
    "lib": ["es2020.string"]
}

Solution 7 - Javascript

this regex works but with defined characters...

var input = "'Warehouse','Local Release','Local Release DA'";

var r =/'[\w\s]+'/gi;
console.log(input.match(regex));

Solution 8 - Javascript

EDIT: This won't work in javascript, but it does work in java. Sorry bout that.

yes, it's called a "look ahead" and a "look behind"

(?<=').*?(?=')
  • (?=') looks ahead for the '
  • (?<=') looks behind for the '

test it out here

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
QuestionJondlmView Question on Stackoverflow
Solution 1 - Javascriptjfriend00View Answer on Stackoverflow
Solution 2 - JavascriptshaedrichView Answer on Stackoverflow
Solution 3 - JavascriptanubhavaView Answer on Stackoverflow
Solution 4 - JavascriptelectrovirView Answer on Stackoverflow
Solution 5 - Javascriptcjc343View Answer on Stackoverflow
Solution 6 - JavascriptJoão PauloView Answer on Stackoverflow
Solution 7 - JavascriptTechsinView Answer on Stackoverflow
Solution 8 - JavascriptJosh TView Answer on Stackoverflow