首页 > 解决方案 > 用于返回由换行符分隔的字符串之间的多个值的正则表达式

问题描述

我正在使用 PowerShell 从可执行文件中读取输出,并且需要将输出解析为数组。我已经尝试过 regex101 并且我开始接近但无法返回所有内容。

身份类型:组
   组类型:通用
项目范围:PartsUnlimited
 显示名称:[PartsUnlimited]\Contributors
  说明:{说明}

5 名成员:
  [?] 测试
  [A] [PartsUnlimited]\PartsUnlimited-1
  [A] [PartsUnlimited]\PartsUnlimited-2
  [?] 测试2
  [A] [零件无限]\零件无限 3

3组成员:
e [A] [org]\项目集合有效用户
  [A] [PartsUnlimited]\端点创建者
e [A] [PartsUnlimited]\项目有效用户

我需要返回一个数组:

测试
[PartsUnlimited]\PartsUnlimited-1
[PartsUnlimited]\PartsUnlimited-2
测试2
[零件无限]\零件无限 3

起初我试过:

$pattern = "(?<=\[A|\?\])(.*)"
$matches = ([Regex]$pattern).Matches(($output -join "`n")).Value

但这也会返回我不想要的“3 组成员:”部分。

我也只能通过(?<=member\(s\):\n).*?\n([?] test) 获得 5 个成员以下的第一个值。

当我添加积极的前瞻时,不会返回任何匹配项:(?<=member\(s\):\n).*?\n(?=Member)

我觉得我快接近了,只是不确定如何处理多个\n字符串并在需要时在字符串之间获取字符串。

标签: regexpowershell

解决方案


您可以分两步完成(不确定是否\G支持PowerShell)。

  1. 第一步是将有问题的块与

    ^\d+\s+member.+[\r\n] (?:.+[\r\n])+

    使用multilineverbose标志,请参阅regex101.com 上的演示

  2. 这个块上,我们需要执行另一个表达式,例如

    ^\s+\[[^][]+\]\s+(.+)

    再次multiline启用该标志,请参阅regex101.com 上的另一个演示


表达式解释:

^\d+\s+member.+[\r\n]     # start of the line (^), digits, 
                          # spaces, "member", anything else + newline
(?:.+[\r\n])+             # match any consecutive line that is not empty

第二个是

^\s+                      # start of the string, whitespaces
 \[[^][]+\]\s+            # [...] (anything allowed within the brackets), 
                          # whitespaces
 (.+)                     # capture the rest of the line into group 1         


如果\G支持,您可以一口气完成:

(?:
    \G(?!\A)
    |
    ^\d+\s+member.+[\r\n]
)
^\s+\[[^][]*\]\s+
(.+)
[\r\n]

也可以在 regex101.com 上查看后者的演示


推荐阅读