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

[问题求助] 求解PowerShell正则+switch获取多行文本中的特定的N行文本

本帖最后由 5i365 于 2022-4-20 09:52 编辑

以前发过类似的贴子, 当时诸多大侠,用|拼接或用正则(?m)的方式匹配到的, 刚刚无意看到一段国外的代码, 感觉很有意思, 既没有用|拼接, 也没有用(?m), 而是用了switch
代码执行后, 成功将===之间的内容提取出来了, 而正则只用了  [=]{3,}  对这个不太理解, 期待高手能指引一下思路, 提前感谢!

另外,如果还是用这种方法, 但是文本内容如下时, 那该怎样用正则取出包含开头和结尾的两行之间的内容?


#Some text
Another text
Even more text with : like that.

==开头==========================
Org: Home Garage Inc.
Author: Mr.Smit
Created: 12/12/2021
Last update: 12/12/2021
Version: 1.1.1
==结尾========================

Other text
========
And More text { Some blocks of code }
Even more not interesting text :-)




  1. $Content = @'
  2. #Some text
  3. Another text
  4. Even more text with : like that.
  5. ==============================
  6. Org: Home Garage Inc.
  7. Author: Mr.Smit
  8. Created: 12/12/2021
  9. Last update: 12/12/2021
  10. Version: 1.1.1
  11. ==============================
  12. Other text
  13. And More text { Some blocks of code }
  14. Even more not interesting text :-)
  15. '@ -split [Environment]::NewLine
  16. $between = $false
  17. Switch -regex ($Content)
  18. {
  19.         '[=]{3,}' {
  20.                 $between = !$between
  21.         }
  22.         Default {
  23.                 If ($between)
  24.                 {
  25.                         $_
  26.                 }
  27.         }
  28. }
复制代码
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

他这个就是弄个开关,遇到3个或以上等号的行就打开开关,下一行开始生效(打印输出)
再次遇到3个或以上的等号就关闭开关,不输出。

TOP

本帖最后由 5i365 于 2022-4-20 09:55 编辑

回复 2# 523066680


   感谢大侠指引, 貌似明白了 自己解决了, 可能还有更好, 更易懂的办法, 欢迎各路高手补充
  1. $Content = @'
  2. #Some text
  3. Another text
  4. Even more text with : like that.
  5. ==开头==========================
  6. Org: Home Garage Inc.
  7. Author: Mr.Smit
  8. Created: 12/12/2021
  9. Last update: 12/12/2021
  10. Version: 1.1.1
  11. ==结尾========================
  12. Other text
  13. ========
  14. And More text { Some blocks of code }
  15. Even more not interesting text :-)
  16. '@ -split [Environment]::NewLine
  17. $between = $false
  18. Switch -regex ($Content)
  19. {
  20.         '==开头.+|==结尾.+' {
  21.                 $between = !$between
  22.         }
  23.         Default {
  24.                 If ($between)
  25.                 {
  26.                         $_
  27.                 }
  28.         }
  29. }
复制代码
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

本帖最后由 for_flr 于 2022-4-20 10:16 编辑

switch那一段等同于这一段:
  1. $get_line=$false
  2. $content|%{
  3.   if($_ -match '={3,}'){
  4.     $get_line=!$get_line
  5.   }else{
  6.     if($get_line -eq $true){$_}
  7.   }
  8. }
复制代码
{}大括号是正则里的限定符。   [=]{3,}表示等号重复3次或3次以上
  1. 代码/语法 说明
  2. * 重复零次或更多次
  3. + 重复一次或更多次
  4. ? 重复零次或一次
  5. {n} 重复n次
  6. {n,} 重复n次或更多次
  7. {n,m} 重复n到m次
复制代码
简单的正则表达式可以在这里学:
https://deerchao.cn/tutorials/regex/regex.htm

TOP

本帖最后由 5i365 于 2022-4-20 10:30 编辑

回复 4# for_flr


非常感谢大侠指引,  
我记得您之前给帮忙解决过类似的问题, 当时用的是 先split 再用 | 拼接, 只看拼接的结果, 是成一行了

前两天idwma大侠也帮解决了一个类似的问题, 他没有split, 直接用 \n 拼接, 只看拼接的结果并没有拼成一行, 但是\n 在正则当中还有区分的作用, 把我转晕了,  

发现PS解决问题, 路子千万条, 没尽没休

http://www.bathome.net/thread-62358-1-1.html
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

回复 5# 5i365


    嘶~~~idwma果然是ps强者,恐怖如斯!
哈哈哈,有时候我们菜鸟才能享受到学习的乐趣,弄懂一个小问题都开心,就跟玩游戏一样,往往成为大佬后,乐趣就不在了。

TOP

回复 6# for_flr


   确实如此, 不断探索的路上才能体会到编程的乐趣
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

本帖最后由 5i365 于 2022-10-28 12:06 编辑

回复 4# for_flr


   大侠, 用这种办法, 没有输出, 用switch就可以
下面的代码, 应该输出


part1

part2

part3


  1. $s = @'
  2. public static void Main(string[] args)
  3. {
  4. #if A
  5.         part1
  6. #endif
  7. part
  8. part
  9. #if V
  10.         part2
  11. #endif
  12. part
  13. part
  14. #if C
  15.         part3
  16. #endif
  17. }
  18. '@ -split [Environment]::NewLine
  19. $between = $false
  20. $s |
  21. foreach{
  22.         if ($_ -match '#if.+|#endif')
  23.         {
  24.                 $between = !$between
  25.         }
  26.         else
  27.         {
  28.                 if ($between -eq $true) { $_ }
  29.         }
  30. }
复制代码
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

返回列表