codeofnode
codeofnode

Reputation: 18609

Why doesn't String#match() result contain captured values?

I am trying to extract a value from simplest JSON in javascript.

After searching i found match to be closest solution.

But trying this with grouping of RegExp, it does not give suitable result.

My object is {"a":"one"} and regex i am building is new RegExp('{"a":"(.*)"}','g')

my results with

'{"a":"one"}'.match(new RegExp('{"a":"(.*)"}','g')) is ["{"a":"one"}"]

'{"a":"one"}'.match(new RegExp('{"a":"(.*)"}'.replace(/([+?^=!:${}|\[\]\/\\])/g, "\\$1"),'g')) 

is also ["{"a":"one"}"]

I am expecting the result should have been ["{"a":"one"}", "one"]

what wrong is happening here?

Upvotes: 2

Views: 189

Answers (1)

Wiktor Stribiżew
Wiktor Stribiżew

Reputation: 626747

See String#match() reference:

If the regular expression includes the g flag, the method returns an Array containing all matched substrings rather than match objects. Captured groups are not returned.

Remove g modifier to get the expected results.

console.log(
   '{"a":"one"}'.match(/{"a":"(.*)"}/)
);

Or, if you need to get multiple matches, use `RegExp#exec` in a loop or - with the latest JS environments - `String#matchAll`:

<!-- begin snippet: js hide: false console: true babel: false -->

And the matchAll variant:

const s = '{"a":"one","a":"two"}', regex = /"a":"([^"]*)"/g;
const results = Array.from([...s.matchAll(regex)], m => m[1]);
console.log(results);

Upvotes: 2

Related Questions