1

我从另一个项目中采用了一些代码,但它搞砸了。我想选择(并最终删除)所有<br/>标签,但只选择标签 <pre>的标签。有这个正则表达式吗?

These 2 lines should not be<br/>
touched. Example only.<br/><br/>

<pre class="code">mysql&gt;
<strong> SELECT state, COUNT(*) FROM president GROUP BY state;</strong><br/>
+-------+----------+<br/>
| state | COUNT(*) |<br/>
+-------+----------+<br/>
| OH    |        7 |<br/>
| PA    |        1 |<br/>
| SC    |        1 |<br/>
| TX    |        2 |<br/>
| VA    |        8 |<br/>
| VT    |        2 |
+-------+----------+</pre>
4

1 回答 1

0

由于您没有提到该工具,我将假设您的正则表达式引擎支持\G1。请注意,这是原始正则表达式,您可能需要进行一些转义:

((?:<pre|\G(?!^))(?:(?!</pre|<\s*/?\s*br)[/s/S])*)<\s*/?\s*br\s*/?\s*>

替代品:$1

一个重要的假设是您的输入中不能有(有效的)嵌套pre标签。

演示。(注意:由于转义,演示的正则表达式可能略有不同)。

((?:<pre|\G(?!^))(?:(?!</pre|<\s*/?\s*br)[/s/S])*)这部分搜索pre标记的开头,或从最后一个匹配项(找到br内部标记pre)继续,然后抓取所有字符,直到它碰到一个有效的结束pre标记(并且必须向前跳过 - 因为正则表达式的下一部分匹配一个br标签)或br标签。(?!^)after是一种启发式方法,\G以确保\G仅在它位于pre标签内之后才可匹配,否则,它也将匹配输入的开头。

一个有效的标签在<开始标签的标签名称和标签名称之间不应有空格</在结束标签的标签名称和标签名称之间不应有空格。参考。这个事实适用于检查标签的边界prepre标签仅在找到有效的结束标签时才结束)。但是,代码将匹配任何看起来像标签的br标签(根据上述语法可能无效)并删除它们。

这是与br标签匹配的部分:<\s*\/?\s*br\s*\/?\s*>。如您所见,它甚至会匹配坏标签,例如< /br>or</ br>< br>or </br/>。我假设您不介意清理这些案件。

脚注

  1. 如果引擎支持\G最后一个匹配边界,那么它也应该支持我在这个正则表达式中使用的其他特性,例如负前瞻(?!pattern)
于 2013-01-13T10:56:32.797 回答