regex - 为什么这个正则表达式有效?

标签 regex

好的,我已经完全了解为什么这个正则表达式有效了。我正在处理的文本是这样的:

<html>
  <body>
    hello
    <img src="withalt" alt="hi"/>asdf
    <img src="noalt" />fdsa<a href="asdf">asdf</a>
    <img src="withalt2" alt="blah" />
  </body>
</html>

使用以下正则表达式(在 php 中测试,但我假设它对所有 perl 正则表达式都是正确的),它将返回所有不包含 alt 标签的 img 标签:

/<img(?:(?!alt=).)*?>/
Returns:
<img src="noalt" />

因此基于此,我认为简单地删除无反向引用会返回相同的结果:

/<img(?!alt=).*?>/
Returns:
<img src="withalt" alt="hi"/>
<img src="noalt" />
<img src="withalt2" alt="blah" />

如您所见,它只返回所有图像标签。然后让事情变得更加困惑,删除? (据我所知,这只是一个通配符)在 * 返回到最后的 >

之后
/<img(?!alt=).*>/
Returns:
<img src="withalt" alt="hi"/>
<img src="noalt" />fdsa<a href="asdf">asdf</a>
<img src="withalt2" alt="blah" />

所以有人愿意通知我,或者至少为我指出这里发生的事情的正确方向吗?

最佳答案

/<img(?:(?!alt=).)*?>/

此正则表达式对它在 img 之后匹配的每个字符应用否定先行 .所以,一旦它找到 alt= ,它停止了。所以,它只会匹配 img标签,没有 alt属性。

/<img(?!alt=).*?>/

这个正则表达式,只是在 img 之后应用了否定前瞻 .所以,它将匹配所有内容,直到第一个 >。对于所有 img后面没有 alt= 的标签,无论是否alt=出现在字符串下方的任何位置。它将在 .*? 中介绍

/<img(?!alt=).*>/

这与上一个相同,但它匹配直到最后一个的所有内容 > , 因为它使用 greedy matching .但我不知道你为什么得到那个输出。你应该得到一切直到最后>对于 </html> .


现在忘掉那里发生的一切,朝着 HTML Parser 前进, 用于解析 HTML .它们专门为此任务而设计。所以,不要费心使用正则表达式,因为您无法通过正则表达式解析所有类型的 HTML。

关于regex - 为什么这个正则表达式有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14884588/

相关文章:

regex - Vim 展开文件中的行组

正则表达式:可选,后跟否定前瞻

java - Java 正则表达式需要帮助

python - python 上的正则表达式到单词匹配

regex - 将开始和结束 anchor 标记之间的字符串替换为其他字符串

c# 表单集合值到 Int 列表

javascript - 使用 JavaScript 拆分逗号分隔的字符串但忽略分号之间的逗号

java - 从一个词到另一个词或到结尾检索字符串的一部分

regex - 用于匹配评论和 first_line_of_entry 的正则表达式

regex - 使用 Regex 重命名文件名并使用 powershell 删除之后的所有内容