gpt4 book ai didi

regex - Powershell-正则表达式多个匹配项

转载 作者:行者123 更新时间:2023-12-04 13:16:28 25 4
gpt4 key购买 nike

也许我的推理是错误的,但是我无法解决这个问题。

这是我的正则表达式:(Device\s#\d(\n.*)*?(?=\n\s*Device\s#|\Z))
试试看:http://regex101.com/r/jQ6uC8/6
$getdevice是输入字符串。我从命令行工具的Stream/Output获取此字符串。

$dstate = $getdevice |
select-string -pattern '(Device\s#\d(\n.*)*?(?=\n\s*SSD\s+|\Z))' -AllMatches |
% { $_ -match '(Device\s#\d(\n.*)*?(?=\n\s*SSD\s+|\Z))' > $null; $matches[0] }
Write-Host $dstate

输出:

Device #0 Device #1 Device #2 Device #3 Device #4



$ matches [1]的相同输出,$ matches [2]为空。

有没有办法像regex101.com一样获得所有比赛?我正在尝试将Output/String拆分为单独的变量(一个用于Device0,一个用于Device1,Device2,依此类推)。

更新:这是命令行工具的输出: http://pastebin.com/BaywGtFE

最佳答案

我在here字符串中使用了样本数据进行测试。尽管这可能取决于示例数据的来源,但这应该可以工作。

使用PowerShell 3.0,我有以下内容

$getdevice | 
select-string -pattern '(?smi)(Device\s#\d+?(.*?)*?(?=Device\s#|\Z))' -AllMatches |
ForEach-Object {$_.Matches} |
ForEach-Object {$_.Value}

或者您的PowerShell Verison是否支持它...
($getdevice | select-string -pattern '(?smi)(Device\s#\d+?(.*?)*?(?=Device\s#|\Z))' -AllMatches).Matches.Value

它返回4个对象及其设备ID。我不知道您是否需要这些,但是如果不需要正则表达式,可以使用环视方式对其进行修改。我更新了正则表达式,以解决设备ID超过一​​位数的情况,以防万一。

我使用的修饰符

  1. s modifier: single line. Dot matches newline characters
  2. m modifier: multi-line. Causes ^ and $ to match the begin/end of each line (not only begin/end of string)
  3. i modifier: insensitive. Case insensitive match (ignores case of [a-zA-Z])


另一个正则表达式模式以这种方式工作,它更短
'(?smi)(Device\s#).*?(?=Device\s#|\Z)'

关于regex - Powershell-正则表达式多个匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24835401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com