Given the following lines:
classes!("text-xl", "text-blue-500")
String::from("test")
classes!("text-sm")
I wish to extract text-xl, text-blue-500 and text-sm and potentially any other strings within classes!
What I have so far is:
(?<=classes!).*- this gives me everything after classes! but not the exact values(?!^")".*?"- this gives me the values I want with but with the quotes- I use the global and multi line flags
CodePudding user response:
If you are using Javascript, and the positive lookbehind is supported (you don't need the multiline flag, only the global flag)
(?<=classes!\((?:"[^"]*",\s*)*")[^"]*(?=")
(?<=Positive lookbehind to assert to the leftclasses!\(Matchclasses!((?:"[^"]*",\s*)*Match optional repetitions of"...","Match a double quote
)Close lookbehind[^"]*Match optional chars other than"(?=")Assert"to the right
const regex = /(?<=classes!\((?:"[^"]*",\s*)*")[^"]*(?=")/g;
const str = `classes!("text-xl", "text-blue-500")
String::from("test")
classes!("text-sm")
`;
console.log(str.match(regex))
CodePudding user response:
You could try a non fixed-width lookbehind like so:
(?<=^classes!\("(?:[^"]*"[^"()]*")*)[^"]*
See an online demo
(?<=- Open a positive lookbehind;^classes!\("- Start-line anchor and match literally 'classes!("';(?:[^"]*"[^()"]*")*- A nested non-capture group to match (0 times) any char other than quotes (and paranthesis), a quote and that same sequence repeated.)- Close lookbehind;
[^"]*- Match 0 (Greedy) characters other than quotes.
