苦苦挣扎,提取正则表达式组匹配

时间:2012-07-31 20:11:23

标签: powershell

我为自己设定了一个以LINQPad challenge为模型的“PowerShell挑战”,并且我很早就经常磕磕绊绊。

我正在尝试编写一个简单的脚本来从Visual Studio解决方案中的项目文件中提取TargetFrameworkVersion元素,以确认项目始终使用单个版本的框架。该元素与以下内容相匹配,其中X.Y = {2.0,3.0,4.0,4.5}

<TargetFrameworkVersion>vX.Y</TargetFrameworkVersion>

我到目前为止:

Get-ChildItem -Recurse -Filter *.csproj | Select-String -Pattern "<TargetFrameworkVersion>(?<version>v[2-4].[05])</TargetFrameworkVersion" | ForEach {$_.Matches}    

在很大程度上要感谢来自ryant的this回答,但是对于如何抓住“版本”组匹配感到磕磕绊绊。结果似乎是正确的:

Groups   : {<TargetFrameworkVersion>v4.0</TargetFrameworkVersion, v4.0}
Success  : True
Captures : {<TargetFrameworkVersion>v4.0</TargetFrameworkVersion}
Index    : 4
Length   : 52
Value    : <TargetFrameworkVersion>v4.0</TargetFrameworkVersion

但我试图抓住“版本”(或接近它)的尝试失败了:

$_.Matches["version"]
$_.Matches.Groups
$_.Matches | Select-Object Groups

我的问题是如何获取“版本”匹配组?

我尝试了我认为更简单的变体,这可以按预期工作:

"<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>" -match "<TargetFrameworkVersion>(?<version>v[2-4].[05])</TargetFrameworkVersion>"
$Matches["version"]

谢谢!

更新:

我接受了EBGreen的建议(谢谢!)并且使用了XML / XPath。使用stej的help,我获得了成功:

$ns = @(defaultNamespace = "http://schemas.microsoft.com/developer/msbuild/2003" }
Get-ChildItem -Recurse -Filter *.csproj | Select-Xml -xpath '//defaultNamespace:PropertyGroup/defaultNamespace:TargetFrameworkVersion' -namespace $ns | Select-Object -expand Node

在使用非XML文件时,我仍然想了解我在RegEx代码中做错了什么。

2 个答案:

答案 0 :(得分:2)

.NET正则表达式对象模型使用集合集合。将您的最终Foreach修改为:

... | Foreach {$_.Matches | Foreach {$_.Groups["version"].Value}}

BTW我同意EBGreen,你想使用XML。

答案 1 :(得分:0)

同意EBGreen和Keith使用XML

$xml = get-content "myproj.vcxproj"
(([xml]$xml).Project.PropertyGroup | ? {$_.Label -eq 'Globals'}).TargetFrameworkVersion