【问题标题】:Stop at first character match? [duplicate]在第一个字符匹配时停止? [复制]
【发布时间】:2023-03-18 11:37:01
【问题描述】:

我想在一个大的 html 文本中获取某个 html 节点,但是我的正则表达式中的某些内容是错误的。

我想获取所有如下所示的网址:

<a href="ftp://mysite.com"> some stuff </a>

我正在努力:

/<a href="ftp:(.+)">/

但有时它会起作用,但有时它会抓住一切,直到下一次关闭&gt;

有没有办法重写这个正则表达式,让它在第一个 &gt; 处停止?

【问题讨论】:

  • + 天生贪婪。您需要通过在+ 之后添加? 限定符来使其不贪婪。所以你的正则表达式是&lt;a href="ftp:(.+?)"&gt;
  • 如果您希望它匹配直到" 的所有内容,请使用[^"]*,而不是.+

标签: regex regex-greedy


【解决方案1】:

+ 是一个 greedy 运算符,这意味着它尽可能匹配并且仍然允许正则表达式的其余部分匹配。为此,我建议使用否定类,表示任何字符,除了:"“一次或多次”次。

/<a href="ftp:([^"]+)">/

Live Demo

【讨论】:

    【解决方案2】:

    让你的正则表达式不贪婪:

    /<a href="ftp:(.+?)">/
    //        here __^
    

    或:

    /<a href="ftp:([^>"]+)">/
    

    但最好使用解析器。

    【讨论】:

      【解决方案3】:

      *+ 是灰色的(尽可能匹配)。通过在它们后面附加?,你可以做到非贪婪。

      /<a href="ftp:(.+?)">/
      

      或者您可以使用否定字符类 ([^...]) 指定排除 "

      /<a href="ftp:([^"]+)">/
      

      BTW, it's not a good idea to use regular expression to parse HTML.

      【讨论】:

        猜你喜欢
        • 2021-01-22
        • 2014-12-04
        • 1970-01-01
        • 2020-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-16
        • 2022-12-03
        相关资源
        最近更新 更多