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


   下面两个需求, 怎样在上面正则的基础上修改? 搞不太懂, 问了几次chatgpt, 答非所问

# 需求2 用正则表达式: 修改指定函数名前的修饰词(不要修改返回值类型)
#例如: 把 FUN1 函数的修饰词改为 public static (如果没有修饰词就加上,如果有就修改)

# 需求3 用正则表达式: 修改指定类名前的修饰词
#例如: 把 CLA 类的修饰词改为 private (如果没有修饰词就加上,如果有就修改)

TOP

回复 6# idwma


    多谢大佬, 这个正则可以适应各种情况, 但是必须关闭单行模式才有效, 前面的正则式必须开单行, 为什么这么大差别呢?

TOP

回复 4# 小白龙
  1. .*FUN1\s*\(\s*\)\s*\{(?:[^{}]+|\{(?<DEPTH>)|\}(?<-DEPTH>))*?(?(DEPTH)(?!))\}
复制代码

TOP

回复 3# idwma

替换成前置都能替换成功, 但是前置的关键词情况太多了, 怎样通用呢
  1. #--------------------------------------------------------------------情况1: 函数FUN1返回值类型void
  2. $s1 = @'
  3. using System;
  4. public class CLA
  5. {
  6. void FUN1()
  7. {
  8. Console.WriteLine("FUN1");
  9. }
  10. }
  11. '@
  12. #--------------------------------------------------------------------情况2: 返回值类型改为了 string
  13. $s2 = @'
  14. using System;
  15. public class CLA
  16. {
  17. string FUN1()
  18. {
  19. return "FUN1";
  20. }
  21. }
  22. '@
  23. #--------------------------------------------------------------------情况3: 加了修饰词 public
  24. $s3 = @'
  25. using System;
  26. public class CLA
  27. {
  28. public void FUN1()
  29. {
  30. Console.WriteLine("FUN1");
  31. }
  32. }
  33. '@
  34. #--------------------------------------------------------------------情况4: 加了修饰词 public static
  35. $s4 = @'
  36. using System;
  37. public class CLA
  38. {
  39. public static string FUN1()
  40. {
  41. return "FUN1";
  42. }
  43. }
  44. '@
  45. # 使用正则表达式删除指定函数
  46. $s1 -replace '(?s)void\s+FUN1\s*\(\s*\)\s*\{(?:[^{}]+|\{(?<DEPTH>)|\}(?<-DEPTH>))*?(?(DEPTH)(?!))\}'
  47. $s2 -replace '(?s)string\s+FUN1\s*\(\s*\)\s*\{(?:[^{}]+|\{(?<DEPTH>)|\}(?<-DEPTH>))*?(?(DEPTH)(?!))\}'
  48. $s3 -replace '(?s)public void\s+FUN1\s*\(\s*\)\s*\{(?:[^{}]+|\{(?<DEPTH>)|\}(?<-DEPTH>))*?(?(DEPTH)(?!))\}'
  49. $s4 -replace '(?s)public static string\s+FUN1\s*\(\s*\)\s*\{(?:[^{}]+|\{(?<DEPTH>)|\}(?<-DEPTH>))*?(?(DEPTH)(?!))\}'
复制代码

TOP

回复 3# idwma

多谢大佬, 这个正则只适用, void 前置关键字的情况, 还有其它几种

@"void\s+FUN1\s*\(\s*\)\s*\{(?:[^{}]+|\{(?<DEPTH>)|\}(?<-DEPTH>))*?(?(DEPTH)(?!))\}"

TOP

多问几次试试

TOP

本帖最后由 小白龙 于 2023-5-9 15:08 编辑

chatgpt的正则都太局限了也没用平衡组, 求路过大老出招, 优化改进一下!

-replace '(?s)(void|string)\s+FUN1\(\).*?\}', ''

-replace '(?<=\bstring)\s+(?=FUN1\(\))', 'public static'

-replace '(?<=class\s+)\w+', 'private'

TOP

返回列表