多个应用程序版本的正则表达式
问题描述:
我试图从我的自定义属性中获取版本列表powershell脚本。 Atrribute看起来是这样的:多个应用程序版本的正则表达式
[assembly: CompatibleVersions("1.7.1.0","1.7.1.1","1.2.2.3")]
而且我结束了这样的正则表达式,但它一点儿也不在所有的工作:
'\(\"([^\",?]*)\"+\)'
答
你应该这样做的过程分为两个步骤:首先,解析出CompatibleVersions
属性,然后拆出来的版本号。否则,您将难以单独查找版本号,而无法找到其他类似版本的数字。
$s = '[assembly: CompatibleVersions("1.7.1.0","1.7.1.1","1.2.2.3")]'
$versions = ($s | Select-String -Pattern 'CompatibleVersions\(([^)]+)\)' | % { $_.Matches }).Groups[1].Value
$versions.Split(',') | % { $_.Trim('"') } | Write-Host
# 1.7.1.0
# 1.7.1.1
# 1.2.2.3
答
您可以使用
$s | select-string -pattern "\d+(?:\.\d+)+" -AllMatches | Foreach {$_.Matches} | ForEach-Object {$_.Value}
\d+(?:\.\d+)+
模式将匹配:
-
\d+
- 1或多个数字 -
(?:\.\d+)+
- 的.
和1+数字1或多个序列。
答
开始通过抓住括号对,里面的一切:
$string = '[assembly: CompatibleVersions("1.7.1.0","1.7.1.1","1.2.2.3")]'
if($string -match '\(([^)]+)\)'){
# Remove the parentheses themselves, split by comma and then trim the "
$versionList = $Matches[0].Trim("()") -split ',' |ForEach-Object Trim '"'
}
答
..之间的数字可以是0串,但不能是00 ,01或类似。
注重起始[
这对于T正则表达式他检查:
^\[assembly: CompatibleVersions\("(?:[1-9]\d*|0)(?:\.(?:[1-9]\d*|0)){3}"(?:,"(?:[1-9]\d*|0)(?:\.(?:[1-9]\d*|0)){3}")*\)]$
Here是带有测试的正则表达式。
但是,如果你正在阅读列表,您应该使用:
^\[assembly: CompatibleVersions\("((?:[1-9]\d*|0)(?:\.(?:[1-9]\d*|0)){3}"(?:,"(?:[1-9]\d*|0)(?:\.(?:[1-9]\d*|0)){3}")*)\)]$
通过它,你会从内部括号中提取的“...‘’...” ...的后果。
之后,通过'“,”'将结果字符串拆分成一个列表,并从第一个元素中删除最后一个元素和第一个“最后一个元素”。现在你有正确版本的字符串列表。
唉,正则表达式不能创建一个没有split()函数的列表。
试试这个'((\ d + \。){2,3} \ d)' – Jonas
即使没有正则表达式,你也可以这样做,但我想你可以使用'Regex.Matches(s,“\”([^ \“] +)\”“)。演员()。选择(m => m.Groups [1] .Value).ToList()' –
我忘了添加,我在powershell脚本中寻找它抱歉 – TjDillashaw