regex - 用于返回由换行符分隔的字符串之间的多个值的正则表达式
问题描述
我正在使用 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
字符串并在需要时在字符串之间获取字符串。
解决方案
您可以分两步完成(不确定是否\G
支持PowerShell
)。
第一步是将有问题的块与
^\d+\s+member.+[\r\n] (?:.+[\r\n])+
使用
multiline
和verbose
标志,请参阅regex101.com 上的演示。在这个块上,我们需要执行另一个表达式,例如
^\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 上查看后者的演示。
推荐阅读
- javascript - JS 中的样式调整没有按计划工作
- javascript - React 类组件中出现意外的关键字“this”
- python - 如何按值对字典进行排序
- c# - 在 DataGrid 的标题中添加图像
- python - 如何将字符串列表更改为元素列表(数字)?
- sql - 如何使用触发器记录 SQL Server 中的更改?
- c# - 通过Xamarin共享项目访问Android APK Expansion文件存储目录
- javascript - 函数只能工作一次,并按降序排列
- python - TypeError:“NoneType”对象不是可迭代的问题
- java - MongoDB & Spring Boot:如何根据过滤器值从数组中仅获取特定的子文档?