There are plenty (e.g. 1 and 2) of answers regarding a non-greedy lookbehind and a regex that selects text between two characters. But the solutions I found so far don't rely on having criteria to the text it needs to select.
Given the example below the non-greedy lookbehind effect is nullified as soon as a criteria to the text it needs to select comes into play, e.g. when (?<=>)[^<>]+(?=<)
becomes (?<=>).+rary.+ring.+(?=<)
https://regex101.com/r/A4Ks1k/3
So the question is, how do I select the text, with some 'fuzzy' criteria like .*rary.*ring.*
, between to specific characters, that can occur more then once and that span multiple lines?
Edit: to answer in the comments; yes, don't match <
and >
in between the two characters within which a match needs to be made.
If you don't want to match <
and >
then you can use the negated character class [^<>]
as you already suggested in you question.
Make the quantifier optional with the asterix *
because .+
matches 1 or more times any character.
Use that character class at the places where you now use .+
In your regex101 example you have the s flag to have the dot match a newline. When you use [^<>]*
you can omit that flag as the negated character class also matches a newline.
(?<=>)[^<>]*rary[^<>]*ring[^<>]*(?=<)