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

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

下面代码用 [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()
复制代码

不管是 .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

评分人数

TOP

回复 8# newswan


    openai

TOP

回复 6# idwma

哪个ai,推荐下

TOP

  1. 对比之后,差异在于,前后多了 (?=(   ))
复制代码

TOP

回复 5# newswan


    呃不知道,把3楼的例子丢给ai得到的结果

TOP

回复 4# idwma


    为什么一个 foreach 就行了?什么原理

TOP

  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

评分人数

TOP

本帖最后由 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}'
复制代码

TOP

内部的匹配项,再一次匹配

TOP

返回列表