Board logo

标题: [问题求助] 求助PowerShell平衡组取所有匹配项 [打印本页]

作者: 小白龙    时间: 2024-1-19 12:29     标题: 求助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()
复制代码

作者: newswan    时间: 2024-1-19 19:12

内部的匹配项,再一次匹配
作者: wanghan519    时间: 2024-1-19 20:14

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

作者: idwma    时间: 2024-1-19 22:47

  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 }
复制代码

作者: newswan    时间: 2024-1-19 23:25

回复 4# idwma


    为什么一个 foreach 就行了?什么原理
作者: idwma    时间: 2024-1-19 23:43

回复 5# newswan


    呃不知道,把3楼的例子丢给ai得到的结果
作者: newswan    时间: 2024-1-20 00:17

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

作者: newswan    时间: 2024-1-20 15:37

回复 6# idwma

哪个ai,推荐下
作者: idwma    时间: 2024-1-20 19:26

回复 8# newswan


    openai
作者: WHY    时间: 2024-1-21 00:07

不管是 .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
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2