我试图从 powershell 脚本中的自定义属性获取版本列表。 Atrribute看起来像这样:
[assembly: CompatibleVersions("1.7.1.0","1.7.1.1","1.2.2.3")]
我最终得到了这样的正则表达式,但它确实起作用了:
'\(\"([^\",?]*)\"+\)'
答案 0 :(得分:2)
您可以使用
$s | select-string -pattern "\d+(?:\.\d+)+" -AllMatches | Foreach {$_.Matches} | ForEach-Object {$_.Value}
\d+(?:\.\d+)+
模式将匹配:
\d+
- 一位或多位(?:\.\d+)+
- 一个或多个.
和1+位数的序列。答案 1 :(得分:2)
首先抓住括号对及其中的所有内容:
$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 '"'
}
答案 2 :(得分:2)
您应该分两步执行此操作:首先解析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
答案 3 :(得分:1)
'"([.\d]+)"'
将匹配由点和数字(\d
)组成的任何子字符串,并包含在双引号(“)中
答案 4 :(得分:1)
...之间的数字可以是0,但不能是00,01或类似。
注意开始[
这是支票的正则表达式:
^\[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()函数的列表。