4

最好用一个例子来解释。

这是文字:

<li>hello 
THE WORDS
</li>

<li> cruel </li>

<li> world THE WORDS </li>

我想查找以and contains开头<li>和结尾的字符串。我希望只匹配and 。</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>

我正在使用崇高文本。

4

2 回答 2

5

编辑:对于新的要求,使用这个正则表达式:

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

解释

  • (?s)激活DOTALL模式,允许点跨行匹配
  • <li>匹配文字字符
  • (?:(?!</li>).)断言后面的不是</li并且匹配一个字符
  • 量词使*?我们懒惰地匹配到......
  • THE WORDS
    • 量词使*?我们懒惰地匹配到......
  • 文字</li>

原始答案(不同要求):

使用这个简单的正则表达式(在 Sublime 中测试):

x+[^xy]*z[^xy]*y+

请参阅正则表达式演示中的匹配项。

解释

  • x+匹配一个或多个x字符
  • [^xy]*匹配任何既不是 anx也不是 a 的字符y
  • z匹配z我们想要的(确保至少有一个)
  • [^xy]*匹配任何既不是 anx也不是 a 的字符y
  • y+匹配一个或多个y字符
于 2014-07-10T09:48:26.070 回答
0

以下命令将仅匹配xx hello zz yy,xx world zz yy字符串并仅从这两个字符串中捕获zz

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

演示

于 2014-07-10T09:37:53.800 回答