[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

下面的代码, 我是通过 -split 参数将多行字符分割后存到数组的,
  1. $s = @'
  2. Key 1
  3. -
  4. Hello 1
  5. World 1
  6. ---
  7. Key 2
  8. -
  9. Hello 2
  10. World 2
  11. ---
  12. Key 3
  13. -
  14. Hello 3
  15. World 3
  16. '@
  17. $a = $s -split '\r\n---\r\n'
  18. $a[0]
复制代码
能否通过下面代码中的开关法实现相同的效果?
代码需要改进一下, 现在只能获取两个---之间的字符串
我需要把---分割成的三个部分的文本存到数组, 就像上面代码执行后的效果一样
或者用正则也行
  1. $s = @'
  2. Key 1
  3. -
  4. Hello 1
  5. World 1
  6. ---
  7. Key 2
  8. -
  9. Hello 2
  10. World 2
  11. ---
  12. Key 3
  13. -
  14. Hello 3
  15. World 3
  16. '@ -split [Environment]::NewLine
  17. $between = $false
  18. $ss = Switch -regex ($s)
  19. {
  20. '---' {
  21. $between = !$between
  22. }
  23. Default {
  24. If ($between)
  25. {
  26. $_
  27. }
  28. }
  29. }
  30. $ss
复制代码

  1. $s = @'
  2. Key 1
  3. -
  4. Hello 1
  5. World 1
  6. ---
  7. Key 2
  8. -
  9. Hello 2
  10. World 2
  11. ---
  12. Key 3
  13. -
  14. Hello 3
  15. World 3
  16. '@
  17. $arr = $s -split '\r?\n';
  18. $out = @();
  19. $str = '';
  20. switch -regex ($arr) {
  21.     '^---$' {
  22.         $out += $str;
  23.         $str = '';
  24.     }
  25.     default {
  26.         $str += $_ + "`r`n";
  27.     }
  28. }
  29. $out += $str;
  30. $out[0];
复制代码
1

评分人数

TOP

回复 2# WHY


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

TOP

回复 3# 小白龙


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

TOP

回复 4# WHY


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

TOP

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

评分人数

TOP

回复 6# terse


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

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

TOP

回复 7# 小白龙

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

TOP

返回列表