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

时间:2017-08-01 10:08:37

标签: regex powershell

我试图从 powershell 脚本中的自定义属性获取版本列表。 Atrribute看起来像这样:

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

我最终得到了这样的正则表达式,但它确实起作用了:

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

5 个答案:

答案 0 :(得分:2)

您可以使用

$s | select-string -pattern "\d+(?:\.\d+)+" -AllMatches | Foreach {$_.Matches} | ForEach-Object {$_.Value}

\d+(?:\.\d+)+模式将匹配:

  • \d+ - 一位或多位
  • (?:\.\d+)+ - 一个或多个.和1+位数的序列。

enter image description here

请参阅regex demo on RegexStorm

答案 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)组成的任何子字符串,并包含在双引号(“)中

Try it here

答案 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()函数的列表。