多个应用程序版本的正则表达式

问题描述:

我试图从我的自定义属性中获取版本列表powershell脚本。 Atrribute看起来是这样的:多个应用程序版本的正则表达式

[assembly: CompatibleVersions("1.7.1.0","1.7.1.1","1.2.2.3")]

而且我结束了这样的正则表达式,但它一点儿也不在所有的工作:

'\(\"([^\",?]*)\"+\)'

+0

试试这个'((\ d + \。){2,3} \ d)' – Jonas

+0

即使没有正则表达式,你也可以这样做,但我想你可以使用'Regex.Matches(s,“\”([^ \“] +)\”“)。演员()。选择(m => m.Groups [1] .Value).ToList()' –

+0

我忘了添加,我在powershell脚本中寻找它抱歉 – TjDillashaw

你应该这样做的过程分为两个步骤:首先,解析出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或多个序列。

enter image description here

regex demo on RegexStorm

开始通过抓住括号对,里面的一切:

$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 '"' 
} 

'"([.\d]+)"'将匹配任何点和数字(\d)构成并包括到双引号(“)

Try it here

+0

更糟 - 任何符号和数字:-)。但是你的信息应该是一个评论。等一下,直到你可以评论:-) – Gangnus

..之间的数字可以是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()函数的列表。