
标题: [问题求助] 求解PowerShell正则+switch获取多行文本中的特定的N行文本 [打印本页]
作者: 5i365 时间: 2022-4-20 08:32 标题: 求解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 :-)
- $Content = @'
- #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 :-)
- '@ -split [Environment]::NewLine
-
- $between = $false
- Switch -regex ($Content)
- {
- '[=]{3,}' {
- $between = !$between
- }
- Default {
- If ($between)
- {
- $_
- }
- }
- }
复制代码
作者: 523066680 时间: 2022-4-20 09:04
他这个就是弄个开关,遇到3个或以上等号的行就打开开关,下一行开始生效(打印输出)
再次遇到3个或以上的等号就关闭开关,不输出。
作者: 5i365 时间: 2022-4-20 09:28
本帖最后由 5i365 于 2022-4-20 09:55 编辑
回复 2# 523066680
感谢大侠指引, 貌似明白了
自己解决了, 可能还有更好, 更易懂的办法, 欢迎各路高手补充
- $Content = @'
- #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 :-)
- '@ -split [Environment]::NewLine
-
- $between = $false
- Switch -regex ($Content)
- {
- '==开头.+|==结尾.+' {
- $between = !$between
- }
- Default {
- If ($between)
- {
- $_
- }
- }
- }
复制代码
作者: for_flr 时间: 2022-4-20 10:15
本帖最后由 for_flr 于 2022-4-20 10:16 编辑
switch那一段等同于这一段:- $get_line=$false
- $content|%{
- if($_ -match '={3,}'){
- $get_line=!$get_line
- }else{
- if($get_line -eq $true){$_}
- }
- }
复制代码
{}大括号是正则里的限定符。 [=]{3,}表示等号重复3次或3次以上- 代码/语法 说明
- * 重复零次或更多次
- + 重复一次或更多次
- ? 重复零次或一次
- {n} 重复n次
- {n,} 重复n次或更多次
- {n,m} 重复n到m次
复制代码
简单的正则表达式可以在这里学:
https://deerchao.cn/tutorials/regex/regex.htm
作者: 5i365 时间: 2022-4-20 10:28
本帖最后由 5i365 于 2022-4-20 10:30 编辑
回复 4# for_flr
非常感谢大侠指引,
我记得您之前给帮忙解决过类似的问题, 当时用的是 先split 再用 | 拼接, 只看拼接的结果, 是成一行了
前两天idwma大侠也帮解决了一个类似的问题, 他没有split, 直接用 \n 拼接, 只看拼接的结果并没有拼成一行, 但是\n 在正则当中还有区分的作用, 把我转晕了, 
发现PS解决问题, 路子千万条, 没尽没休
http://www.bathome.net/thread-62358-1-1.html
作者: for_flr 时间: 2022-4-20 11:19
回复 5# 5i365
嘶~~~idwma果然是ps强者,恐怖如斯!
哈哈哈,有时候我们菜鸟才能享受到学习的乐趣,弄懂一个小问题都开心,就跟玩游戏一样,往往成为大佬后,乐趣就不在了。
作者: 5i365 时间: 2022-4-20 13:32
回复 6# for_flr
确实如此, 不断探索的路上才能体会到编程的乐趣
作者: 5i365 时间: 2022-10-28 12:05
本帖最后由 5i365 于 2022-10-28 12:06 编辑
回复 4# for_flr
大侠, 用这种办法, 没有输出, 用switch就可以
下面的代码, 应该输出
part1
part2
part3
- $s = @'
- public static void Main(string[] args)
- {
- #if A
- part1
- #endif
-
- part
- part
-
- #if V
- part2
- #endif
-
- part
- part
-
- #if C
- part3
- #endif
- }
- '@ -split [Environment]::NewLine
-
- $between = $false
- $s |
- foreach{
- if ($_ -match '#if.+|#endif')
- {
- $between = !$between
- }
- else
- {
- if ($between -eq $true) { $_ }
- }
- }
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |