正则表达式匹配内部匹配

Im *_*ash 2 html regex notepad++ visual-studio

我在正则表达式方面遇到了一些麻烦。我需要在长 HTML 页面中推断这部分文本:

<li class="menuItem">
    <a class="menuItem" href="/site/ContactUs.aspx?section=510">
        <span class="posNR">3.
        </span>Contact Us<span class="shortDesc"></span><span class="line"></span>
    </a>
</li>
Run Code Online (Sandbox Code Playgroud)

另一个问题是我有一些格式如下的字符串:

<li class="menuItem"><a class="menuItem" href="/site/ContactUs.aspx?section=510"><span class="posNR">3.</span>Contact Us<span class="shortDesc"></span><span class="line"></span></a></li>
Run Code Online (Sandbox Code Playgroud)

在其他一些部分我有这个:

<li class="menuItem">
              <a class="menuItem" href="/site/ContactUs.aspx?section=510">
                <span class="posNR">3.
                                </span>Contact Us<span class="shortDesc"></span><span class="line"></span></a>
            </li>
Run Code Online (Sandbox Code Playgroud)

我想从例如这里提取这个特定部分:

        <li class="menuItem">
          <a class="menuItem" href="/site/News.aspx?section=316&amp;ViewType=Actual&amp;IdType=316">
            <span class="posNR">2.
                            </span>News<span class="shortDesc"></span><span class="line"></span></a>
      asdsdasda  </li>


        <li class="menuItem">
          <a class="menuItem" href="/site/ContactUs.aspx?section=510">
            <span class="posNR">3.
                            </span>Contact Us<span class="shortDesc"></span><span class="line"></span></a>
        </li>


      </ul>
Run Code Online (Sandbox Code Playgroud)

到目前为止,我尝试过一些正则表达式,例如

(<li*[\s\S]*?<\/li>)
Run Code Online (Sandbox Code Playgroud)

我在记事本 ++ 和/或 Visual Studio Code 中使用此正则表达式。

deg*_*ant 6

使用这个正则表达式:

(<li(?:(?!<li)[\s\S])*?ContactUs[\s\S]*?<\/li>)
Run Code Online (Sandbox Code Playgroud)

此模式通过调整以[\s\S]不允许<liie来利用调整的贪婪令牌解决方案(?:(?!<li)[\s\S])*。您可以在此处阅读有关它的更多信息以及何时使用它。

  • <li匹配起始文字<li
  • (?:(?!<li)[\s\S])*?惰性非捕获组,具有负的前瞻能力(?!,确保<li比赛中不存在另一个组。添加此内容是为了与<li... <li... </li>整个内容不匹配,而仅从第二个开始匹配<li>
  • ContactUs匹配文字,因为条件声明ContactUs必须出现在匹配中li
  • [\s\S]*?匹配任何字符(懒惰地)
  • <\/li>匹配结束</li>

Regex101 演示

希望这可以帮助!