返回列表 发帖

[问题求助] PowerShell不用split而使用开关switch法或正则法分割多行文本存到数组

下面的代码, 我是通过 -split 参数将多行字符分割后存到数组的,
$s = @'
Key 1
-
Hello 1
World 1
---
Key 2
-
Hello 2
World 2
---
Key 3
-
Hello 3
World 3
'@
$a = $s -split '\r\n---\r\n'
$a[0]COPY
能否通过下面代码中的开关法实现相同的效果?
代码需要改进一下, 现在只能获取两个---之间的字符串
我需要把---分割成的三个部分的文本存到数组, 就像上面代码执行后的效果一样
或者用正则也行
$s = @'
Key 1
-
Hello 1
World 1
---
Key 2
-
Hello 2
World 2
---
Key 3
-
Hello 3
World 3
'@ -split [Environment]::NewLine
$between = $false
$ss = Switch -regex ($s)
{
'---' {
$between = !$between
}
Default {
If ($between)
{
$_
}
}
}
$ssCOPY

$s = @'
Key 1
-
Hello 1
World 1
---
Key 2
-
Hello 2
World 2
---
Key 3
-
Hello 3
World 3
'@
$arr = $s -split '\r?\n';
$out = @();
$str = '';
switch -regex ($arr) {
    '^---$' {
        $out += $str;
        $str = '';
    }
    default {
        $str += $_ + "`r`n";
    }
}
$out += $str;
$out[0];COPY
1

评分人数

TOP

回复 2# WHY


  大佬 能把 switch 改成 if 语句吗? 对这个 switch 有点晕

TOP

回复 3# 小白龙


    如果 Switch 语句晕,If 语句一样会晕
21~29行改成这样:
$arr | %{
    if( $_ -eq '---' ){
        $out += $str;
        $str = '';
    }else{
        $str += $_ + "`r`n";
    }
}COPY
遍历arr每一行,如果数组元素不等于三个横杠,字符串str叠加;等于三个横杠,字符串str存放到out,同时str设为空值。
就这么个简单的逻辑。

TOP

回复 4# WHY


   多谢大佬, if 感觉要好理解

TOP

$out = ( $s + "`r`n---" | Select-String -Pattern "(([\S\s]+?)[\r\n]+---[`r`n]?)" -AllMatches ).Matches.Value -replace "---" ,''COPY
1

评分人数

TOP

回复 6# terse


   感谢大佬, 正则改为下面也行, 最后那个应该是[`r`n]  还是[\r\n] ?

"([\S\s]+?)[\r\n]+---[\r\n]?"

TOP

回复 7# 小白龙

都认 这里就用[\r\n]这个吧  用的这个`r`n 本来是两步走不是这个正则的 后来合并一行后没改过来 反正一样用就好

TOP

返回列表