【发布时间】:2020-02-10 00:21:28
【问题描述】:
我正在尝试编写一个正则表达式来获取所有出现在特定 HTML 标记之间的模式 !\d+。
输入示例(Regex101 上提供):
bla bla !1234 abcd <pre> every occurrence here should be ignored !12345 but it is not </pre> here should be captured !54321 but <code><pre> here it should be again ignored !76453 </pre></code> and here again captured !123456
我试过这个 RE:
(?:<(?P<tag>code|pre)>.*?<\/(?P=tag)>)?(?!<(code|pre)>)*!(\d+)
逻辑是这样的:
-
(?:<(?P<tag>code|pre)>.*?</(?P=tag)>)?:捕获RE第一部分相关标签之间的所有文本,这样如果标签之间出现模式,就会被这个RE消费掉 -
(?!<(code|pre)>)*: 确保 RE 的第一部分和所需模式之间没有其他开始标签 -
!(\d+):匹配图案,抢号
这似乎不起作用,我不太明白为什么。标签之间的数字仍然匹配。 这是为什么呢?
谢谢。
【问题讨论】:
-
正则表达式查找特定 HTML 标记之外的模式我们真的还在这样做吗?
-
我想我找到了解决方案:
(?:<(pre|code)>.*?</\1>|!(\d+))似乎做到了。这个想法是使用“或”表达式来捕获所需标签之间的所有文本,并且!\d+模式只有在它没有包含在标签中时才会匹配。 @Toto:建议的帖子似乎没有回答我的正则表达式问题。它建议了其他几种 HTML 解析方法。正如这篇文章的另一条评论中所解释的那样,我专门询问了一个正则表达式。