首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模式内匹配模式

模式内匹配模式
EN

Stack Overflow用户
提问于 2011-01-04 22:26:03
回答 5查看 199关注 0票数 0

我正试图匹配<sup>标记中任何括号内的项目。

我的正则表达式太贪婪了,从第一个<sup>标记开始,最后一个</sup>标记结束。

代码语言:javascript
复制
/<sup\b[^>]*>(.*?)\[(.*?)\](.*?)<\/sup>/

示例html:

代码语言:javascript
复制
<sup>[this should be gone]</sup>
<sup>but this should stay</sup>
<sup>this should [ also stay</sup>
[and this as well]
<sup><a href="#">[but this should definitely go]</a></sup>

知道为什么吗?

谢谢!

编辑:我想这些答案是有道理的。我已经解析了很多没有regex的HTML;我只是认为这个特定的示例将与regex一起工作,因为它将执行以下操作:

  1. 参见第一个<sup>标记
  2. 查找</sup>的第一个实例
  3. 搜索内部(野生)(括号)(野生)(关闭括号)(野生)
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-01-04 22:32:55

你真的不能这么做。用正则表达式解析HTMl是不可能的,因为正则表达式只能匹配正则语言;这些语言是我们实际使用的语言的一个更简单的子集。一种非常常见的非正则语言是平衡括号的Dyck语言;不可能将嵌套的括号与正则表达式正确匹配。如果你想一想,HTML和这个是一样的,用标签代替括号。因此,匹配(a)正确嵌套的sup标记是不可能的,(b)匹配平衡大括号是不可能的。我自己不使用PHP,但我知道它可以访问HTML;我建议使用它。然后,对每个sup标记进行过滤,并检查每个标记的内部文本。如果只想捕获内部文本仅为[...]的标记,其中...不包含方括号,则可以使用^\[[^\]]+\]$作为正则表达式;如果需要真正的嵌套,则需要进行更复杂的检查。

票数 2
EN

Stack Overflow用户

发布于 2011-01-04 22:32:18

如果您的要求是明确删除"<sup>[“和"]</sup>”中的任何文本,那么您就可以了。但是,在上一个示例中,您也希望说明嵌套标记,以及可能是任意嵌套标记。所以我必须提醒你..。

不要用regex解析html!

票数 0
EN

Stack Overflow用户

发布于 2011-01-04 22:33:15

这不是正常的行为吗?你有你的正则表达式的指定非贪婪选项吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4599107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档