如何编写正则反向匹配,仅保留HTML中script标签及内部内容?
原正则的问题
- 否定断言逻辑错误:你在每个字符位置校验后续是否存在完整script块,只有script块起始位置会被排除,其他位置都会被命中,再加上你加了行首
^、行尾$锚点,VS Code默认正则为每行独立匹配,跨行内容直接无法正确识别。 - 跨行适配错误:你将跨行匹配逻辑放在否定断言内部,VS Code使用的JavaScript正则引擎,无法正确识别嵌套在断言内的跨行匹配逻辑,自然达不到预期效果。
解决方案
分两种场景适配你的需求:
场景1:仅需删除script标签保留其余内容
直接用VS Code替换功能即可,操作更简单:
- 查找内容填:
<script>(.|\n)*?</script> - 替换内容留空,点击全部替换即可完成需求。
场景2:需要直接选中除script标签及内部内容外的所有内容
使用如下正则即可:
(^|(?<=<\/script>))[\s\S]*?(?=<script>|$)
逻辑说明:
(^|(?<=<\/script>)):匹配起始位置为全文开头,或是</script>结束的位置[\s\S]*?:非贪婪匹配任意字符,包括换行符(?=<script>|$):匹配终止位置为<script>开始的位置,或是全文结束的位置
内容的提问来源于stack exchange,提问作者Bathiudeen
相关产品推荐
相关产品推荐

