正则表达式匹配多行字符串开始与x,以y结尾并包含z而不是中间的x

时间:2014-07-10 09:13:33

标签: regex sublimetext non-greedy

更好地用一个例子来解释。

这是文字:

<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。

2 个答案:

答案 0 :(得分:5)

编辑:对于新要求,请使用此正则表达式:

(?s)<li>(?:(?!</li>).)*?THE WORDS.*?</li>

<强>解释

  • (?s)激活DOTALL模式,允许点跨行匹配
  • <li>匹配文字字符
  • (?:(?!</li>).)声称后面的内容不是</li并且匹配一个字符
  • *?量词使我们懒得匹配....
  • THE WORDS
    • *?量词使我们懒得匹配....
  • literal </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 yyxx world zz yy字符串,并仅从两个字符串中捕获zz

<li>(?:(?!<\/li>).)*(THE WORDS).*?<\/li>

DEMO