gpt4 book ai didi

java - 替换 Java 源文件中的开始注释

转载 作者:太空宇宙 更新时间:2023-11-03 15:31:38 24 4
gpt4 key购买 nike

我正在编写一个 C# 程序来更新起始注释——通常是 Java 源代码的许可 header 。以下代码段可以完成这项工作。

                foreach (string r in allfiles)
{
// GC.Collect();
string thefile = System.IO.File.ReadAllText(r);
var pattern = @"/\*(?s:.*?)\*/[\s\S]*?package";
Regex regex1 = new Regex(pattern /*,RegexOptions.Compiled */) ;
var replaced = regex1.Replace(thefile, newheader + "package");
System.IO.File.WriteAllText(r, replaced);
}

问题是在处理了数百个源文件后,进程在 .Replace 处挂起

这不是垃圾收集的问题,因为强制它不能解决问题。RegexOptions.Compiled 与否并不重要。

我很确定这取决于模式中的一个问题,因为挂起出现在某些文件上 - 如果从处理中删除 - 让作业继续直到一千个源文件结束。但是如果我单独处理这些文件,它可以工作,如果我使用在线测试工具作为 http://regexstorm.net/tester https://www.myregextester.com/index.php

如果有任何方法可以更好地优化用于查找文件中第一个 Java 注释的搜索模式,请告诉我。

提前谢谢你。

最佳答案

您的正则表达式包含 2 个与惰性点匹配相关的瓶颈(单行模式下的 .[\s\S]*? 是同义词)。对大文件运行正则表达式时,回溯缓冲区可能会很容易且快速地溢出。

常用的技术是使用否定字符类和量化组来展开/解包构造。

你可以使用

@"/\*[^*]*(?:\*(?!/)[^*]*)*\*/\s*package"

参见 regex demo

正则表达式分解:

  • /\* - 文字 /*
  • [^*]* - *
  • 以外的 0 个或多个字符
  • (?:\*(?!/)[^*]*)* - (?s:.*?) 的展开变体,匹配 0或更多序列...
    • \*(?!/) - * 符号后面没有 /
    • [^*]* - *
    • 以外的 0 个或多个符号
  • \*/ - */
  • 的文字序列
  • \s* - 0 个或多个空白字符
  • package - 文字字母序列 package

关于java - 替换 Java 源文件中的开始注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33611115/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com