标题: [问题求助] 求助PowerShell平衡组取所有匹配项 [打印本页]
作者: 小白龙 时间: 2024-1-19 12:29 标题: 求助PowerShell平衡组取所有匹配项
下面代码用 [Regex]::Matches($s, $p) | ForEach-Object { $_.Value } 只能输出两组, 我想输出四组, 应该怎样修改?- $s = 'win s(dows s(" s(abc) ") )); s()'
- $p = "s\(((?:(?>[^()]*)|\((?<Open>)|\)(?<-Open>))*(?(Open)(?!)))\)"
-
- [Regex]::Matches($s, $p)
-
- #修改powershell代码,我想输出所有满足s()的文本, 一共4组
- #s(abc)
- #s(" s(abc) ")
- #ss(dows s(" s(abc) ") )
- #s()
复制代码
作者: newswan 时间: 2024-1-19 19:12
内部的匹配项,再一次匹配
作者: wanghan519 时间: 2024-1-19 20:14
本帖最后由 wanghan519 于 2024-1-19 20:57 编辑
用perl试了半天,好像需要零宽断言,保证各级都搜索到,powershell还没试出来- echo 'win s(dows s(" s(abc) ") )); s()' | perl -lane 'while(/s(?=(\((?:[^()]+|(?1))*\)))/g){print $&,$1}'
复制代码
作者: idwma 时间: 2024-1-19 22:47
- $s = 'win s(dows s(" s(abc) ") )); s()'
- $p = "(?=(s\((?:[^()]+|(?<Open>)\(|(?<-Open>)\))*(?(Open)(?!))\)))"
-
- [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
复制代码
作者: 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,平衡组里面的固化分组都不要省略(除非你是神,能够百分百确定会匹配成功)
不仅仅是为了提高效率,更是为了避免过度回溯。
也可以用递归- $s = 'win s(dows s(" s(abc) ") )); s()'
- $p = 's\((?:(?>[^()]*)|\((?<Open>)|\)(?<-Open>))*(?(Open)(?!))\)'
-
- function fun($str) {
- [regex]::Matches($str, $p) | forEach {
- fun $_.Value.SubString(2);
- $_.Value;
- }
- }
- fun $s
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |