我从另一个项目中采用了一些代码并且搞砸了。我想选择(并最终删除)所有<br/>
代码,但只选择那些内部 <pre>
代码。这有正则表达式吗?
These 2 lines should not be<br/>
touched. Example only.<br/><br/>
<pre class="code">mysql>
<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>
答案 0 :(得分:0)
由于您没有提及该工具,我将假设您的正则表达式引擎支持\G
1 。请注意,这是原始正则表达式,您可能需要进行一些转义:
((?:<pre|\G(?!^))(?:(?!</pre|<\s*/?\s*br)[/s/S])*)<\s*/?\s*br\s*/?\s*>
替换:$1
一个重要的假设是输入中不能有(有效)嵌套pre
标记。
Demo。 (注意:由于转义,演示可能会略有不同的正则表达式。)
((?:<pre|\G(?!^))(?:(?!</pre|<\s*/?\s*br)[/s/S])*)
此部分搜索pre
代码的开头,或从上一个匹配位置继续(其中找到br
内的pre
代码),然后抓取所有字符直到它达到有效的结束pre
标记(并且必须向前跳过 - 因为正则表达式的下一部分与br
标记匹配)或br
标记。 (?!^)
之后的\G
是一种启发式方法,可以确保\G
只有在pre
标记内后才能匹配,否则,它也会匹配输入的开头。
有效标记的开头标记的<
和标记名称之间不能有空格,并且<
,/
和结束标记的标记名称之间不能有空格。 Reference。此事实适用于检查pre
标记的边界(pre
标记仅在找到有效结束标记时结束)。但是,代码将匹配看起来像 br
标记的任何标记(根据上述语法可能无效)并删除它们。
这是与br
标记匹配的部分:<\s*\/?\s*br\s*\/?\s*>
。如您所见,它甚至会匹配< /br>
或</ br>
或< br>
或</br/>
等不良标记。我认为你不介意这些案件被清理干净。
<强>脚注强>
\G
最后一个匹配边界,那么它还应支持我在此正则表达式中使用的其他功能,例如否定前瞻(?!pattern)
。