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

[问题求助] PowerShell怎样用正则匹配成对的括号?

xzc abc(s "(abc)"); dfg()

我想取上面红色字部分, 但是用下面的正则, 会串了括号, 把后面的也包括进来了

我要匹配与abc后面那个(成对的括号, 对这种正则一直没搞懂, 请路过高手帮忙, 谢谢

abc\(.+\)
  1. $s='xzc abc(s "(abc)"); dfg()'
  2. $s -replace 'abc\(.+\)'
复制代码

回复 2# went


    多谢大佬,

我把正则放到了字符串中让正则处理, 就不行了
  1. $s='xzc abc(s "\([^\)]*[^\(]*\)"); dfg()'
  2. $s -replace 'abc\([^\)]*[^\(]*\)'
复制代码

TOP

回复 3# WHY

多谢大佬,
灵了, 能处理下面这个复杂的情况, 就是正则太长了, 没精简点的吗?
  1. $s='xzc abc(s "\([^\)]*[^\(]*\)"); dfg()'
  2. [regex]::Match($s, 'abc\((?:(?>[^()]*)|\((?<Open>)|\)(?<-Open>))*(?(Open)(?!))\)').Value;
复制代码

TOP

回复 3# WHY

另外, 我在另一个软件里执行会报错, 应该是不支持 <Open> 这种写法, 怎样更通用一些? 多谢

TOP

本帖最后由 小白龙 于 2023-3-12 07:16 编辑

回复 8# WHY

多谢大佬指导,

我也看了一下那个平衡组的链接, 但是水平有限实在看不懂, 楼2的正则我能理解, 想着就是它了, 没想到它没有彻底解决问题, 大佬的正则不能看懂, 但确实能解决各种情况

我不是专业的程序员, 就是偶尔改改现成的代码, 感觉没有一定积累, 看懂平衡组真是有点难度

现在遇到的问题是, 我的那个程序不支持保存到 <Open> 这种命名的组中 我把它改成数字组的形式, 还是不行, 其实还是自己没能理解整行正则的含义, 生搬硬套

大佬能再帮一把就太感谢了, 不是不想自己解决, 是实在积累不够, 看不懂

可能看的情况多了, 在某个时刻会豁然开朗, 就把它理解了

TOP

回复 7# Five66

感谢指导, 以前遇也改过成对的<>的代码, 好像没有()这么复杂

用3楼大佬的, 确实能适应各种情况了,但是有的软件不支持这种写法, 搜索了一下, 说是这种<>号的组命名不支持, 改成数字的就可以了, 但是水平有限还是没有搞定

TOP

也找到一篇非常不错的关于捕获组的文章, 写的也真是太用心了, 有前因, 有后果, 有动图, 大部分能看懂, 但是还是不会用,

https://www.cnblogs.com/piperck/p/15878834.html

TOP

本帖最后由 小白龙 于 2023-3-12 19:00 编辑

回复 13# idwma
多谢大佬指导,

应该不是不支持平衡组, 而不是不支持那种命名,

另外, 怎么递归呀, 不太懂, 能帮一把吗? 多谢

或者用别的办法也行

TOP

回复 15# idwma

虽然看不懂, 但还是非常感谢!

难道我的问题, 用正则, WHY大佬的思路是唯一正解了吗?  不能在went大佬的正则基础上改改吗?

TOP

回复 17# WHY


    多谢大佬, 太细心了, 感谢

TOP

本帖最后由 小白龙 于 2023-3-13 20:07 编辑

回复 20# terse


    大佬实在是高, 这个正则兼容性不错, 不支持平衡组的软件也能用, 目前还没遇到匹配不到的

难道还有匹配不了的情况吗? 能说说吗? 怕到时候掉坑里

TOP

回复 22# terse


    哦, 看来WHY大佬的平衡组正则式, 确实是唯一正解了, 能适应各种情况

TOP

返回列表