更好地用一个例子来解释。
这是文字:
<li>hello
THE WORDS
</li>
<li> cruel </li>
<li> world THE WORDS </li>
我想找到以<li>
开头的字符串,以</li>
结尾并包含THE WORDS
。我希望只与<li> hello THE WORDS </li>
和<li> world THE WORDS </li>
匹配。
我尝试了什么:(?s)<li>.*?(THE WORDS).*?</li>
有了这个,第二场比赛是<li> cruel </li> <li> world THE WORDS </li>
。
我使用的是Sublime Text。
答案 0 :(得分:5)
编辑:对于新要求,请使用此正则表达式:
(?s)<li>(?:(?!</li>).)*?THE WORDS.*?</li>
<强>解释强>
(?s)
激活DOTALL
模式,允许点跨行匹配<li>
匹配文字字符(?:(?!</li>).)
声称后面的内容不是</li
并且匹配一个字符*?
量词使我们懒得匹配.... THE WORDS
*?
量词使我们懒得匹配.... </li>
原始答案(不同要求):
使用这个简单的正则表达式(在Sublime中测试):
x+[^xy]*z[^xy]*y+
查看regex demo中的匹配项。
<强>解释强>
x+
匹配一个或多个x
字符[^xy]*
匹配任何既不是x
也不是y
z
与我们想要的z
匹配(确保至少有一个)[^xy]*
匹配任何既不是x
也不是y
y+
匹配一个或多个y
字符答案 1 :(得分:0)
以下命令仅匹配xx hello zz yy
,xx world zz yy
字符串,并仅从两个字符串中捕获zz
。
<li>(?:(?!<\/li>).)*(THE WORDS).*?<\/li>