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 quotesIf 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 left
classes!\( Match classes!((?:"[^"]*",\s*)* Match optional repetitions of "..."," Match a double quote) Close lookbehind[^"]* Match optional chars other than "(?=") Assert " to the rightconst regex = /(?<=classes!\((?:"[^"]*",\s*)*")[^"]*(?=")/g;
const str = `classes!("text-xl", "text-blue-500")
String::from("test")
classes!("text-sm")
`;
console.log(str.match(regex))
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.