Regex - extract string between double quotes where line starts with a keyword
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
Solution 1:
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 left-
classes!\(
Matchclasses!(
-
(?:"[^"]*",\s*)*
Match optional repetitions of"...",
-
"
Match a double quote
-
-
)
Close lookbehind -
[^"]*
Match optional chars other than"
-
(?=")
Assert"
to the right
Regex demo
const regex = /(?<=classes!\((?:"[^"]*",\s*)*")[^"]*(?=")/g;
const str = `classes!("text-xl", "text-blue-500")
String::from("test")
classes!("text-sm")
`;
console.log(str.match(regex))
Solution 2:
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.