如何用正则从HTML表格每行第4个<td>标签开始删除内容?
你需要处理PowerShell生成的已安装软件列表HTML,要删掉每行<tr>里从第4个<td>开始的所有内容,只保留前3个<td>和<tr>的结构对吧?先看你给的原始HTML行示例:
<tr><td>Adobe Acrobat Reader DC</td><td>18.009.20050</td><td>20171130</td><td>kratos.kcprod1.com</td><td>4104917a-93f2-46e5-941a-c4efd54504b7</td><td>True</td></tr><tr><td>Adobe Flash Player 28 ActiveX</td><td>28.0.0.137</td><td></td><td>kratos.kcprod1.com</td><td>4104917a-93f2-46e5-941a-c4efd54504b7</td><td>True</td></tr>
原来的正则问题分析
你用的(?<=<td>)(.*)(?=<\/tr>)会选中整行,是因为这个正则从第一个<td>的结束位置开始,一直匹配到</tr>前的所有内容,没有限制匹配起点是第4个<td>,范围太宽泛了。
正确的正则表达式
试试这个正则来匹配你需要删除的部分:
(<td>.*?<\/td>){3}\K.*?(?=<\/tr>)
我给你拆解下每个部分的作用:
(<td>.*?<\/td>){3}:精准匹配前3个完整的<td>单元格,{3}指定匹配次数,.*?是非贪婪匹配,避免把多个<td>内容当成一个整体匹配\K:这个是核心技巧,它会忽略掉前面已经匹配到的内容(也就是前3个<td>),只把后面的内容作为最终匹配结果.*?(?=<\/tr>):匹配从第4个<td>开始到</tr>前的所有内容,同样用非贪婪匹配防止跨行匹配错误
替换时直接把匹配到的内容换成空字符串,就能得到你想要的结果:只保留前3个<td>和<tr>的首尾标签。
更高效的优化方案:从源头避免额外处理
其实你完全不用生成HTML后再用正则修改,直接在PowerShell脚本里就能生成只包含需要列的HTML!看你现在的脚本最后是Select-Object -Property DisplayName, DisplayVersion, InstallDate | ft,这里的ft(Format-Table)可能会额外生成一些PowerShell默认的列,导致HTML里多出不需要的单元格。
改成用ConvertTo-Html直接生成指定列的HTML,一步到位:
| Select-Object -Property DisplayName, DisplayVersion, InstallDate | ConvertTo-Html -Property DisplayName, DisplayVersion, InstallDate -Title "已安装软件列表"
这样生成的HTML表格就只有你需要的三列,完全不用再做后续的正则修改,既高效又不容易出错。
内容的提问来源于stack exchange,提问作者obs0lete

