正则命名捕获组匹配至可选单词for前内容的技术求助
正则提取库名、版本信息的解决方案
问题分析
原正则使用贪婪匹配的.+,导致最后一个捕获组会包含for及后续无关内容,需要调整匹配逻辑,让每个捕获组在遇到下一个关键分隔符时停止。
调整后的正则表达式
Vuln : Upgrade\s*(?<vulnNameFromTo>.+?)\sfrom\s*(?<vulnCurrentVersionFromTo>.+?)\sto\s*(?<vulnFixVersionFromTo>.+?)(?:\sfor\s.*)?
正则各部分说明
Vuln : Upgrade\s*:匹配固定前缀,跳过后续任意空格(?<vulnNameFromTo>.+?):非贪婪匹配库名,直到遇到下一个from标记停止\sfrom\s*:匹配版本分隔符from,跳过后续任意空格(?<vulnCurrentVersionFromTo>.+?):非贪婪匹配当前版本,直到遇到下一个to标记停止\sto\s*:匹配修复版本分隔符to,跳过后续任意空格(?<vulnFixVersionFromTo>.+?):非贪婪匹配修复版本,直到遇到可选的for或字符串结尾(?:\sfor\s.*)?:可选匹配for及后续无关内容,不捕获该部分
测试验证
针对三个测试字符串,提取结果完全符合需求:
- 字符串:
Vuln : Upgrade pypi://onnx from 1.12.0 to 1.13.0 Final- 库名:
pypi://onnx - 当前版本:
1.12.0 - 修复版本:
1.13.0 Final
- 库名:
- 字符串:
Vuln : Upgrade gav://com.google.guava:guava from 22.0 to 32.0.0-android for github.com/blah/blah- 库名:
gav://com.google.guava:guava - 当前版本:
22.0 - 修复版本:
32.0.0-android
- 库名:
- 字符串:
Vuln : Upgrade gav://org.apache.avro:avro from 1.11.1 for Android to 1.11.3 Final for github.com/blah/blah- 库名:
gav://org.apache.avro:avro - 当前版本:
1.11.1 for Android - 修复版本:
1.11.3 Final
- 库名:
内容的提问来源于stack exchange,提问作者bojackhorseman99
相关产品推荐
相关产品推荐

