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

回复 8# WHY

多谢大佬指导,

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

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

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

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

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

TOP

本帖最后由 523066680 于 2023-3-12 00:23 编辑

其实我看题主四楼和五楼的例子都可以用  );  来限定末尾。
当然更复杂的情况且有必要的话可以考虑设计grammar来解决

抄了一段perl6的文法案例
  1. grammar pair {
  2.     token TOP     { <func> }
  3.     rule func    { <name> '(s' <.ws> <string> ')' }
  4.     rule name    { [\w]+ }
  5.     rule string  {
  6.         (:ignoremark \") ~ \"
  7.         [
  8.             \w |
  9.             [ '\\' <[\\/bfnrt"():]> ] |
  10.             <-[\\\"\n\t]>+
  11.         ]*
  12.     }
  13. };
  14. my $match = pair.parse('abc(s "\\:\/())))abc\([^\)]*[^\(]*\)")');
  15. say $match;
复制代码
结果
  1. 「abc(s "\:\/())))abc\([^\)]*[^\(]*\)")」
  2. func => 「abc(s "\:\/())))abc\([^\)]*[^\(]*\)")」
  3.   name => 「abc」
  4.   string => 「"\:\/())))abc\([^\)]*[^\(]*\)"」
  5.    0 => 「"」
复制代码
并没有解决问题 (逃

TOP

回复 6# 小白龙


      我要是你,我会打开链接,先了解一下什么是"平衡组";
或者搜索一下网络,搞明白那些流派支持 "平衡组",那些不支持。
像你这样,只想着要答案,一百年也学不会。

TOP

像这种匹配成对括号的要正则引擎的支持,很复杂也可能不准确,建议先获取包含最外层左括号的字符串,然后手动解析字符串,找到匹配的最外层右括号的位置后截取字符串

TOP

回复 3# WHY

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

TOP

回复 3# WHY

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

TOP

回复 2# went


    多谢大佬,

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

TOP

这个需要用到所谓的 "平衡组"
https://learn.microsoft.com/zh-c ... ng_group_definition
  1. $s='xzc abc(s "(abc)"); dfg()';
  2. [regex]::Match($s, 'abc\((?:(?>[^()]*)|\((?<Open>)|\)(?<-Open>))*(?(Open)(?!))\)').Value;
复制代码

TOP

abc\([^\)]*[^\(]*\)

TOP

返回列表