如何用Perl正则表达式匹配属性中缺失的开头或结尾双引号
核心正则及解决方案
针对你明确的规则条件(属性值仅含字符、无空格无特殊符号、开头引号前必为等号=、单行支持多属性匹配),可直接使用以下Perl正则匹配缺失开头/结尾引号的场景:
/(?<==)(?!")([^"\s>]+)|(?<==)"([^"\s>]+)(?=[\s>])/g
匹配逻辑说明
- 前半段
(?<==)(?!")([^"\s>]+):匹配缺失开头引号的属性值- 反向断言前面是等号=,正向断言下一个字符不是引号",提取连续的非引号、非空格、非标签结束符>的内容,即为缺开头引号的属性值
- 后半段
(?<==)"([^"\s>]+)(?=[\s>]):匹配缺失结尾引号的属性值- 反向断言前面是等号=,匹配到开头引号"后提取属性值,正向断言后续是空格或者标签结束符>,说明属性值已结束但无结尾引号
一键补全引号的替换代码
Perl中可以直接用正则替换一步补全两种异常场景:
$content =~ s/(?<==)(?!")([^"\s>]+)|(?<==)"([^"\s>]+)(?=[\s>])/ defined $1 ? "\"$1\"" : "\"$2\"" /ge;
- 匹配到缺开头引号的场景时
$1有值,直接给属性值前后补全双引号 - 匹配到缺结尾引号的场景时
$2有值,给属性值尾部补全双引号即可
测试效果
你提供的异常示例:
<table pgwide="0" id="dvr_config_firmware> <title>DFR Firmware</title> <tgroup cols="2"> <colspec colname="col1> <colspec colname="col2">
经过替换后会自动修正为:
<table pgwide="0" id="dvr_config_firmware"> <title>DFR Firmware</title> <tgroup cols="2"> <colspec colname="col1"> <colspec colname="col2">
内容的提问来源于stack exchange,提问作者JennyP
相关产品推荐
相关产品推荐

