找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 14979|回复: 9

[问题求助] 求助PowerShell平衡组取所有匹配项

[复制链接]
发表于 2024-1-19 12:29:42 | 显示全部楼层 |阅读模式
下面代码用 [Regex]::Matches($s, $p) | ForEach-Object { $_.Value } 只能输出两组, 我想输出四组, 应该怎样修改?
  1. $s = 'win s(dows s(" s(abc) ") )); s()'
  2. $p = "s\(((?:(?>[^()]*)|\((?<Open>)|\)(?<-Open>))*(?(Open)(?!)))\)"

  3. [Regex]::Matches($s, $p)

  4. #修改powershell代码,我想输出所有满足s()的文本, 一共4组
  5. #s(abc)
  6. #s(" s(abc) ")
  7. #ss(dows s(" s(abc) ") )
  8. #s()
复制代码
发表于 2024-1-19 19:12:47 | 显示全部楼层
内部的匹配项,再一次匹配
发表于 2024-1-19 20:14:44 | 显示全部楼层
本帖最后由 wanghan519 于 2024-1-19 20:57 编辑

用perl试了半天,好像需要零宽断言,保证各级都搜索到,powershell还没试出来
  1. echo 'win s(dows s(" s(abc) ") )); s()' | perl -lane 'while(/s(?=(\((?:[^()]+|(?1))*\)))/g){print $&,$1}'
复制代码
发表于 2024-1-19 22:47:26 | 显示全部楼层
  1. $s = 'win s(dows s(" s(abc) ") )); s()'
  2. $p = "(?=(s\((?:[^()]+|(?<Open>)\(|(?<-Open>)\))*(?(Open)(?!))\)))"

  3. [Regex]::Matches($s, $p) | ForEach-Object { $_.groups[1].value }
复制代码

评分

参与人数 1技术 +1 收起 理由
小白龙 + 1 乐于助人

查看全部评分

发表于 2024-1-19 23:25:58 | 显示全部楼层
回复 4# idwma


    为什么一个 foreach 就行了?什么原理
发表于 2024-1-19 23:43:48 | 显示全部楼层
回复 5# newswan


    呃不知道,把3楼的例子丢给ai得到的结果
发表于 2024-1-20 00:17:18 | 显示全部楼层

  1. 对比之后,差异在于,前后多了 (?=(   ))
复制代码
发表于 2024-1-20 15:37:02 | 显示全部楼层
回复 6# idwma

哪个ai,推荐下
发表于 2024-1-20 19:26:15 | 显示全部楼层
回复 8# newswan


    openai
发表于 2024-1-21 00:07:32 | 显示全部楼层
不管是 .net 还是 perl,平衡组里面的固化分组都不要省略(除非你是神,能够百分百确定会匹配成功)
不仅仅是为了提高效率,更是为了避免过度回溯。

也可以用递归
  1. $s = 'win s(dows s(" s(abc) ") )); s()'
  2. $p = 's\((?:(?>[^()]*)|\((?<Open>)|\)(?<-Open>))*(?(Open)(?!))\)'

  3. function fun($str) {
  4.     [regex]::Matches($str, $p) | forEach {
  5.         fun $_.Value.SubString(2);
  6.         $_.Value;
  7.     }
  8. }
  9. fun $s
复制代码

评分

参与人数 1技术 +1 收起 理由
小白龙 + 1 乐于助人

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 02:31 , Processed in 0.010842 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表