匹配和捕获多个RegEx语句

时间:2016-12-14 19:24:34

标签: regex powershell windows-server-2008-r2

我在2008 R2文件服务器上运行以下内容以提取配额信息,因为PS FSRM模块不可用。匹配$RegEx变量中的字符串时,只要变量中只有2个字符串,就可以正常工作,$matches[1]$matches[2]值按预期添加对象数组,但是当我尝试添加第三次捕获时,或者在这种情况下5次捕获时,我根本没有输出。 $matches中没有任何内容,$objArr中没有任何内容。

$RegEx = 'Quota Path:\s+(.*)[\s\S]*?' +
         'Source Template:\s+(.*)\s+' +
         'Limit:\s+(.*)\s+' +
         'Used:\s+(.*)\s+' +
         'Available:\s+(.*)'
$objArr = @()

$objArr = (dirquota qu l | Out-String) -replace '\r\n', "`n" -split '\n\n' |
          where {$_ -match $RegEx} |
          foreach {
            New-Object -TypeName psobject -Property ([ordered]@{
              QuotaPath  = $matches[1]
              Template   = $matches[2]
              QuotaLimit = $matches[3]
              Used       = $matches[4]
              Availble   = $matches[5]
            })
          }

我不能理解的是我可以重新排列捕获并且2的任何组合都可以工作,所以看起来捕获字符串在某种程度上是正确的,但是一旦我尝试添加第3个或更多,我一无所获。我确定我错过了RegEx捕获字符串格式的方式。

dirquota qu l | Out-String输出一个字符串,如下所示:

...

Quota Path:             E:\DirA\SubdirA\SubdirA1
Share Path:             \\SERVER\SubdirA\SubdirA1
                        \\SERVER\E\DirA\SubdirA\SubdirA1
                        \\SERVER\DirA\SubdirA\SubdirA1
Source Template:        TemplateA (Matches template)
Quota Status:           Enabled
Limit:                  500.00 MB (Hard)
Used:                   6.00 KB (0%)
Available:              499.99 MB
Peak Usage:             6.00 KB (4/1/2015 12:27 PM)
Thresholds:
   Warning ( 80%):      Event Log
   Limit (100%):        Event Log

Quota Path:             E:\DirB\SubdirB\SubdirB1
Share Path:             \\SERVER\SubdirB\SubdirB1
                        \\SERVER\E\DirB\SubdirB\SubdirB1
                        \\SERVER\DirB\SubdirB\SubdirB1
Source Template:        TemplateB (Matches template)
Quota Status:           Enabled
Limit:                  500.00 MB (Hard)
Used:                   1.00 KB (0%)
Available:              500.00 MB
Peak Usage:             1.00 KB (7/12/2016 12:09 PM)
Thresholds:
   Warning ( 80%):      Event Log
   Limit (100%):        Event Log

...

2 个答案:

答案 0 :(得分:0)

  • 我最近在回答中看到$匹配的有效性 管道边界上的集合不受保证。
  • 因此我删除了哪里,
  • 从文件中获取数据
  • 新的第二个RegEx用于将文件拆分为块 与(包括)Quota Path
  • 我在RegEx101.com中打破了RegEx,请参阅链接。
  • 并使用命名捕获组来更好地跟踪
  • 生成的$ objArr通过管道输出到Out-Gridview
# https://www.regex101.com/r/3WrfYk/1
$File = ".\quota.txt"
# dirquota qu l | Set-Content $File
$Delimiter = 'Quota Path:'
$Escaped   = [regex]::Escape($Delimiter)
$Split     = "(?!^)(?=$Escaped)"
$RegEx = '(?smi)^Quota Path:\s+(?<QuotaPath>.*?)$.*?' `
         + '^Source Template:\s+(?<Template>.*?)$.*?' `
         + '^Limit:\s+(?<QuotaLimit>.*?)' `
         + 'Used:\s+(?<Used>.*?)$.' `
         + 'Available:\s+(?<Available>.*?)$.'
$objArr = @()
$objArr = ((Get-Content $File -Raw) -split $Split)|
  foreach {
    if ($_ -match $RegEx) {
       New-Object -TypeName psobject -Property (
       [ordered]@{ QuotaPath  = $matches.QuotaPath 
                   Template   = $matches.Template  
                   QuotaLimit = $matches.QuotaLimit
                   Used       = $matches.Used      
                   Availble   = $matches.Availble   
                })
    } # if
} # foreach
$objArr|select QuotaPath,Template,QuotaLimit,Used,Available|out-gridview

答案 1 :(得分:0)

由于您的正则表达式根本不匹配,因此您无法获得所需的结果。在SourceTemplateLimit记录之间还有一行,修改后的正则表达式不会解释:

...
Quota Path:             E:\DirA\SubdirA\SubdirA1
Share Path:             \\SERVER\SubdirA\SubdirA1
                        \\SERVER\E\DirA\SubdirA\SubdirA1
                        \\SERVER\DirA\SubdirA\SubdirA1
Source Template:        TemplateA (Matches template)
Quota Status:           Enabled
Limit:                  500.00 MB (Hard)
Used:                   6.00 KB (0%)
Available:              499.99 MB
...

正则表达式的Source Template:\s+(.*)\s+部分与(子)字符串匹配&#34;源模板:&#34;后跟一个或多个空格字符(\s+),所有字符的分组匹配,直到(但不包括)下一个换行符((.*)),以及一个或多个空格字符({{1 }})。但是,由于正则表达式的下一部分为\s+,因此如果Limit:\s+(.*)\s+之后的行以Source Template:开头,则您只能获得匹配。

基本上,模式Limit:仅匹配:

...
                        \\SERVER\DirA\SubdirA\SubdirA1
Source Template:        TemplateA (Matches template)
Quota Status:           Enabled
Limit:                  500.00 MB (Hard)
...

当你真正需要它来匹配时:

...
                        \\SERVER\DirA\SubdirA\SubdirA1
Source Template:        TemplateA (Matches template)
Quota Status:           Enabled
Limit:                  500.00 MB (Hard)
...

要使其包含您需要更改的其他行

Source Template:\s+(.*)\s+

'Source Template:\s+(.*)\s+'

字符类'Source Template:\s+(.*)[\s\S]+?' 匹配任何字符而不仅仅是空格字符([\s\S]),修饰符\s与一个或多个字符进行非贪婪匹配。这样,表达式包括直到下一次出现的字符串+?的所有文本。