I try to find the text between two brackets and get them into array.
To do that, I use this regex: /\{\{([^)] )\}\}/. (it matches the text between two brackets).
But when I have more than one match, it does the match wrong.
Why? it is because the regex is incorrect, or do I need to use some regex flag?
I was expecting to get an array of foo and bar.
const a = 'text:{{ foo }} {{bar}}';
const b = a.match(/\{\{([^)] )\}\}/);
console.log(b);
My final goal is to transform this text: text:{{ foo }} {{bar}} to 'text:' foo bar. this is mean I want to strip out the brackets and wrap the what is not brackets with a quote and contact them with a plus character.
To do that I want to find foo and bar and then split the text with the results and contact them.
CodePudding user response:
I once had to do a task which required me to use a regex like yours to find and replace text between brackets, i wrote a one-liner function to do so and i'm posting it as an answer for future reference
/**
* @param str - The string to parse
* @param conf - The object to get "variables" from (eg: { name: 'John' } would be the object if the string was 'Hello {{name}}')
*/
const parse = (str, conf) => str.replace(/{{(?<sc>[a-z] )}}/g, (substr, match) => conf[match] ?? substr);
In your case you can use something like that:
const a = 'text:{{ foo }} {{bar}}'
const b = a.match(/(?<=\{\{\s*)\w (?=\s*\}\})/g)
console.log(b) // output: ['foo', 'bar']
Explanation:
(?<=\{\{\s*): this is a positive look-behind, it assert that the match is preceded by the regex between brackets, in this case i look for{{followed by 0 or more spaces\w: matches any word character (foo,bar)(?=\s*\}\}): this does the same as the first group but it assert that the match is followed by the match between brackets, in this case i look for 0 or more spaces and then}}g: is the global modifier, i added it since i want to match all occurences of this regex and not stop after the first match
