标题: [问题求助] PowerShell不用split而使用开关switch法或正则法分割多行文本存到数组 [打印本页]
作者: 小白龙 时间: 2022-11-21 16:55 标题: 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]
复制代码
能否通过下面代码中的开关法实现相同的效果?
代码需要改进一下, 现在只能获取两个---之间的字符串
我需要把---分割成的三个部分的文本存到数组, 就像上面代码执行后的效果一样
或者用正则也行- $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)
- {
- $_
- }
- }
- }
- $ss
复制代码
作者: WHY 时间: 2022-11-22 14:58
- $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];
复制代码
作者: 小白龙 时间: 2022-11-22 16:45
回复 2# WHY
大佬 能把 switch 改成 if 语句吗? 对这个 switch 有点晕
作者: WHY 时间: 2022-11-22 19:51
回复 3# 小白龙
如果 Switch 语句晕,If 语句一样会晕
21~29行改成这样:- $arr | %{
- if( $_ -eq '---' ){
- $out += $str;
- $str = '';
- }else{
- $str += $_ + "`r`n";
- }
- }
复制代码
遍历arr每一行,如果数组元素不等于三个横杠,字符串str叠加;等于三个横杠,字符串str存放到out,同时str设为空值。
就这么个简单的逻辑。
作者: 小白龙 时间: 2022-11-22 19:55
回复 4# WHY
多谢大佬, if 感觉要好理解
作者: terse 时间: 2022-11-24 11:29
- $out = ( $s + "`r`n---" | Select-String -Pattern "(([\S\s]+?)[\r\n]+---[`r`n]?)" -AllMatches ).Matches.Value -replace "---" ,''
复制代码
作者: 小白龙 时间: 2022-11-24 13:10
回复 6# terse
感谢大佬, 正则改为下面也行, 最后那个应该是[`r`n] 还是[\r\n] ?
"([\S\s]+?)[\r\n]+---[\r\n]?"
作者: terse 时间: 2022-11-24 14:15
回复 7# 小白龙
都认 这里就用[\r\n]这个吧 用的这个`r`n 本来是两步走不是这个正则的 后来合并一行后没改过来 反正一样用就好
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |