正则表达式,用于在 HTML 标记的重复模式中创建不同的捕获组

Regular expression to make distinct capture groups within a repeating pattern of HTML tags

提问人:Austin Becker 提问时间:7/12/2022 最后编辑:Andy LesterAustin Becker 更新时间:7/12/2022 访问量:93

问:

我想在每次出现这些 HTML 标签时制作一个带有文本的捕获组。<li></li>

例如:

<li>packaged in a classy box</li> <li>measures 0.9x1.15" (2.3x2.8cm)</li> <li> <em>925 silver</em> and <em>14k white gold</em> arrive with an 20" <strong> silver chain </strong> </li>

所以我需要的输出是:

捕获组 1: 捕获组 2: 捕获组 3:

packaged in a classy boxmeasures 0.9x1.15" (2.3x2.8cm)<em>925 silver</em> and <em>14k white gold</em> arrive with an 20" <strong> silver chain </strong>

我试着环顾四周,但它们与第一个和最后一个之间的所有内容都匹配。<li><\li>

正则表达式 HTML 解析

评论

1赞 Pshemo 7/12/2022
“但它们匹配之间的一切”,看看懒惰/不情愿的量词 regular-expressions.info/repeat.html#lazy。但一般来说,正则表达式和 HTML 并不匹配。例如,如果 HTML 更复杂并且有嵌套列表,例如 then regex like 将返回,但随后将返回而不是 full 。通常,应该解析 HTML,并且应该从解析的 DOM 中选择其元素(例如通过 CSS 选择器或 xpath 表达式)<li>foo</li> <li><ul><li>A</li><li>B</li></ul></li><li>.*?</li>foo<ul><li>A<ul><li>A</li><li>B</li></ul>

答:

1赞 Alexandre Fenyo 7/12/2022 #1

只需使用表示“匹配任何字符的最小数量”的模式即可。.*?

例如,假设您的 HTML 输入保存在文件 input.html 中。下面是一个使用 Perl 正则表达式完成的 Perl 程序:

cat input.html | perl -pe 's%<li>(.*?)</li>.*?<li>(.*?)</li>.*?<li>(.*?)</li>%capture group 1: \1\ncapture group 2: \2\ncapture group 3: \3\n%'

输出为:

capture group 1: packaged in a classy box
capture group 2: measures 0.9x1.15" (2.3x2.8cm)
capture group 3:  <em>925 silver</em> and <em>14k white gold</em> arrive with an 20" <strong> silver chain </strong>

请注意,使用一些正则表达式来解析 HTML 并不是正确执行操作的最佳方法。更好的方法是使用 XSLT 处理器(如 xsltproc)将 XSLT 样式表应用于输入,或者使用 DOM 分析器。DOM 解析器可能是最好的工具,因为它可以处理一些格式错误的 HTML 输入。

评论

0赞 Austin Becker 7/16/2022
太棒了,谢谢!感谢解析 HTML 的技巧。不幸的是,对于这种特定情况,我必须使用 HTML(我将来会找到解决方案)。