I'm using regex to get the indices of variables accessing pattern represented as string, for example:
string = "test[2][56].var1[4]"
The regex match result in the groups 2, 56, 4 captured.
matchGroups = ["2", "56", "4"]
The regex below works.
\[([^\.\]]+)\]
But I can't allow cases like:
"test.[3].var1"
or
"test[3]/"
I tried to limit the characters allowed before and after each group using the regex below:
[\]a-zA-Z0-9]\[([^\.\]]+)\]([\[a-zA-Z0-9])?
But some cases stopped working like the case "test[0].var7[3][4]"(4 is not captured).
I need help to make this work with all cases again(cases are in the link below).
2 Answers 2
I would replace the string, then do matching
Replace Regex:
/.*?\[(\d+)\].*?/
Replace the string where any number between brackets is replaced by a number followed by ,
Match Regex:
/\d+(?=,)/
Look ahead positive; which
Find any number followed by ,
const captureNumber = str => str.replace(/.*?\[(\d+)\].*?/g, "1,ドル").match(/\d+(?=,)/g)
console.log(captureNumber("test[0].var7[3][4]")); //[ "0", "3", "4" ]
console.log(captureNumber("test[3]/")); //[ "3" ]
console.log(captureNumber("test.[3].var1")); //[ "3" ]
console.log(captureNumber("test[2][56].var1[4]")); //[ "2", "56", "4" ]
Comments
the simplest would be to use a regexp using a positive lookbehind and a positive lookahead. To this, you can add safety on spaces in case you have a case like "test[ 2 ][ 56 ].var1[ 4 ]", to which a .trim() method string must be applied. Here is a snippet illustrating this:
const getIndex = str => str.match(/(?<=\[) *\d+ *(?=\])/g).map(val => val.trim());
console.log(getIndex("test[0].var7[3][4]")); //[ "0", "3", "4" ]
console.log(getIndex("test[3]/")); //[ "3" ]
console.log(getIndex("test.[3].var1")); //[ "3" ]
console.log(getIndex("test[2 ][ 56 ].var1[4 ]")); //[ "2", "56", "4" ]
Good luck !
"test[3]/"": that puzzles me. So the/should make it not match? Which other characters should make it not match? What if"test[3][4]/"? Does then the[3]still match, but not the[4]? What about a space, a line break, a comma instead of the slash....etc? What should match in"test[1][hello][2][#][3], next[4]"?test[3][4]/is not valid in javascript for example.test[foo[3]]andtest["foo"]andtest[4/2]?test[4], not expressions or object property, I also can't allowtest[foo[3]], I didn't think about this case, I should avoid it too.test[1].view[2]["foo"][3][4/2]should it match 1, 2 and 3, or should it match nothing? What if there is a semicolon after this expression, liketest[1].view[2]["foo"][3][4/2];... should it then match nothing?