PowerShell使用多行正则匹配文件内跨行img标签获取src属性失败如何解决
问题排查与解决方案
核心原因
Select-String 默认逐行扫描文件内容,每次仅将单一行文本传入正则匹配,你的正则需要匹配跨多行的img标签,自然无法命中结果。除此之外还有正则适配性问题需要修正。
排查修改步骤
- 第一步:读取文件为完整单字符串
给Get-Content加上-Raw参数,将整个文件内容一次性读取为单个字符串,而非拆分后的行数组,才能支持跨行正则匹配。 - 第二步:修正正则的换行匹配逻辑
Windows系统下文本文件默认换行符为CRLF(即\r\n),你的正则中仅写了\n,无法匹配Windows换行,需将所有\n替换为\r?\n,同时可以精简正则冗余写法:
原正则中的[""|']写法有误,字符组内的|会被识别为普通字符而非或逻辑,直接写["']即可匹配双引号或单引号;{1}这类量词属于冗余写法可直接删除。
修正后正则参考:^(?m)[ ]*<img[ ]*(?:\r?\n(?:(?!<img).)*?)+?\[src\]=["'](.*?)["'](?:\r?\n(?:(?!<img).)*?)?>$ - 第三步:添加多匹配参数
给Select-String加上-AllMatches参数,才能返回所有匹配结果,而非仅返回第一个匹配项。
可运行代码示例
# 定义修正后的正则 $pattern = '(?m)^[ ]*<img[ ]*(?:\r?\n(?:(?!<img).)*?)+?\[src\]=["''](.*?)["''](?:\r?\n(?:(?!<img).)*?)?>$' # 读取文件+匹配+处理结果 Get-Content -Path $path -Raw | Select-String -Pattern $pattern -AllMatches | ForEach-Object { $_.Matches | ForEach-Object { $src = $_.Groups[1].Value # 计算当前匹配img标签的起始行号 $startLine = ($_.Value.Substring(0, $_.Index) -split "\r?\n").Count # 这里替换为你自己的处理逻辑 Write-Host "匹配到src值:$src,起始行号:$startLine" } }
内容的提问来源于stack exchange,提问作者Qhori
相关产品推荐
相关产品推荐

