Better explain with an example.
This is text:
<li>hello
THE WORDS
</li>
<li> cruel </li>
<li> world THE WORDS </li>
I want to find strings start with <li>
and ends with </li>
and contains THE WORDS
. I am expecting to only match with <li> hello THE WORDS </li>
and <li> world THE WORDS </li>
.
What I tried: (?s)<li>.*?(THE WORDS).*?</li>
With this, second match is <li> cruel </li> <li> world THE WORDS </li>
.
I am using Sublime Text.
EDIT: For the new requirements, use this regex:
(?s)<li>(?:(?!</li>).)*?THE WORDS.*?</li>
Explanation
(?s)
activates DOTALL
mode, allowing the dot to match across lines<li>
matches literal chars(?:(?!</li>).)
asserts that what follows is not </li
and matches one character*?
quantifier makes us lazily match up to....THE WORDS
*?
quantifier makes us lazily match up to....</li>
Original Answer (different requirements):
Use this simple regex (tested in Sublime):
x+[^xy]*z[^xy]*y+
See matches in the regex demo.
Explanation
x+
matches one or more x
chars[^xy]*
matches any chars that are neither an x
nor a y
z
matches the z
we want (ensuring there is at least one)[^xy]*
matches any chars that are neither an x
nor a y
y+
matches one or more y
chars