批处理之家's Archiver

5i365 发表于 2022-4-20 08:32

求解PowerShell正则+switch获取多行文本中的特定的N行文本

[i=s] 本帖最后由 5i365 于 2022-4-20 09:52 编辑 [/i]

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

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


#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 :-)




[code]
$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)
                {
                        $_
                }
        }
}[/code]

523066680 发表于 2022-4-20 09:04

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

5i365 发表于 2022-4-20 09:28

[i=s] 本帖最后由 5i365 于 2022-4-20 09:55 编辑 [/i]

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=254589&ptid=62421]2#[/url] [i]523066680[/i] [/b]


   感谢大侠指引, 貌似明白了 :) 自己解决了, 可能还有更好, 更易懂的办法, 欢迎各路高手补充
[code]$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)
                {
                        $_
                }
        }
}[/code]

for_flr 发表于 2022-4-20 10:15

[i=s] 本帖最后由 for_flr 于 2022-4-20 10:16 编辑 [/i]

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

5i365 发表于 2022-4-20 10:28

[i=s] 本帖最后由 5i365 于 2022-4-20 10:30 编辑 [/i]

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=254594&ptid=62421]4#[/url] [i]for_flr[/i] [/b]


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

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

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

[url=http://www.bathome.net/thread-62358-1-1.html]http://www.bathome.net/thread-62358-1-1.html[/url]

for_flr 发表于 2022-4-20 11:19

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=254597&ptid=62421]5#[/url] [i]5i365[/i] [/b]


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

5i365 发表于 2022-4-20 13:32

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=254602&ptid=62421]6#[/url] [i]for_flr[/i] [/b]


   确实如此, 不断探索的路上才能体会到编程的乐趣

5i365 发表于 2022-10-28 12:05

[i=s] 本帖最后由 5i365 于 2022-10-28 12:06 编辑 [/i]

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=254594&ptid=62421]4#[/url] [i]for_flr[/i] [/b]


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


part1

part2

part3


[code]$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) { $_ }
        }
}[/code]

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.