[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
像这种匹配成对括号的要正则引擎的支持,很复杂也可能不准确,建议先获取包含最外层左括号的字符串,然后手动解析字符串,找到匹配的最外层右括号的位置后截取字符串

TOP

说一下吧,正则匹配只有3种情况:
0次(包括多次0次)
最少次
最多次

字符串'xzc abc(s "(abc)"); dfg()' 中的 'abc(' 可以通过最少次1次匹配得到
但是与 'abc(' 中的左括号匹配的右括号是不属于上面三种情况
0次就是匹配不到
最少次会匹配到 'abc)'中的右括号
最多次会匹配到 'dfg()' 中的右括号
指定次数虽然可能匹配得到,但是不通用,除非所有需要匹配的都是所指定的次数

平衡组是在正则引擎的支持上实现这种不属于三种情况匹配的通用解决方案之一
平衡组其实就是命名组的自动计数,匹配到左括号就计数加1,匹配到右括号就计数减1,最后判断计数是否为0(或偶数)来判断是否匹配

也可以手动根据平衡组的实现来手动匹配,例如
  1. $s='xzc abc(s "(abc)"); dfg()'
  2. $ss=[regex]::Match($s, 'abc\(.+\)').value
  3. $a=[Collections.ArrayList]::new()
  4. $a.Add(-1)
  5. (0..($ss.Length-1)).ForEach({
  6. if($ss[$_] -eq '('){$a.Add($_)}
  7. if($ss[$_] -eq ')'){
  8.     $a.Removeat($a.Count-1)
  9.     if($a.Count -eq 1){$a[0]=$_;break}
  10. }
  11. })
  12. [Console]::WriteLine($ss.Substring(0,$a[0]+1))
复制代码
1

评分人数

TOP

返回列表