说一下吧,正则匹配只有3种情况:
0次(包括多次0次)
最少次
最多次
字符串'xzc abc(s "(abc)"); dfg()' 中的 'abc(' 可以通过最少次1次匹配得到
但是与 'abc(' 中的左括号匹配的右括号是不属于上面三种情况
0次就是匹配不到
最少次会匹配到 'abc)'中的右括号
最多次会匹配到 'dfg()' 中的右括号
指定次数虽然可能匹配得到,但是不通用,除非所有需要匹配的都是所指定的次数
平衡组是在正则引擎的支持上实现这种不属于三种情况匹配的通用解决方案之一
平衡组其实就是命名组的自动计数,匹配到左括号就计数加1,匹配到右括号就计数减1,最后判断计数是否为0(或偶数)来判断是否匹配
也可以手动根据平衡组的实现来手动匹配,例如- $s='xzc abc(s "(abc)"); dfg()'
- $ss=[regex]::Match($s, 'abc\(.+\)').value
- $a=[Collections.ArrayList]::new()
- $a.Add(-1)
- (0..($ss.Length-1)).ForEach({
- if($ss[$_] -eq '('){$a.Add($_)}
- if($ss[$_] -eq ')'){
- $a.Removeat($a.Count-1)
- if($a.Count -eq 1){$a[0]=$_;break}
- }
- })
- [Console]::WriteLine($ss.Substring(0,$a[0]+1))
复制代码
|