如何用PowerShell提取pom.xml中不在parent等标签内的artifactId
PowerShell提取pom.xml根层级artifactId实现方案
问题背景
需要通过PowerShell正则匹配pom.xml配置文件,仅提取项目根层级的<artifactId>节点值,忽略<parent>、<build>、<dependencies>三个标签内部嵌套的所有artifactId内容。
此前使用的命令会返回所有位置的artifactId,包含父POM、构建插件、依赖项内的节点,无法满足过滤需求,原命令如下:
Get-Content pom.xml -Raw | % { [regex]::matches($_ , '<artifactId>([\s\S]*?)</artifactId>')} |% {$_.Groups[1].Value}
可用实现命令
直接在pom.xml所在目录执行以下命令即可:
$pomRaw = Get-Content pom.xml -Raw # 正则排除parent/build/dependencies标签块内的artifactId匹配 $matchPattern = '(?s)(?<!<(parent|build|dependencies)>[\s\S]*?)<artifactId>(.*?)</artifactId>(?![\s\S]*?</\1>)' [regex]::Matches($pomRaw, $matchPattern) | ForEach-Object { $_.Groups[2].Value.Trim() }
正则逻辑说明
(?s):开启单行匹配模式,允许元字符匹配换行符,适配xml换行排版的场景- 前后两个负向零宽断言做双重校验:确保当前匹配的artifactId节点,既没有被包裹在
<parent>/<build>/<dependencies>的起始标签之后,也不会出现在这三个标签的对应闭合标签之前,从根本上排除三个标签块内部的嵌套节点 - 非贪婪匹配
(.*?)提取artifactId标签内的文本,最后用Trim()处理掉标签内可能存在的换行、空格缩进
注意:该方案仅适用于标签格式规范、无异常交叉嵌套的标准Maven pom文件,若文件存在标签未闭合、标签交叉嵌套的异常格式,匹配结果可能存在偏差。
扩展说明
如果后续需要额外排除其他标签(比如<dependencyManagement>、<profiles>)内的artifactId,只需要在正则的(parent|build|dependencies)分组里用|分隔追加对应的标签名即可。
内容的提问来源于stack exchange,提问作者wehelpdox
相关产品推荐
相关产品推荐

