你好,
背景:
我正在使用带有 RegExp 检查器模块的 Checkstyle 4.4.2 来检测 java 源头文件中的文件名何时与它们所在的类或接口的文件名不匹配。当开发人员将标头从一个类复制到另一个类并且不修改“文件:”标签时,可能会发生这种情况。
RexExp 检查器中使用的正则表达式已经经历了很多次化身,并且(尽管此时它可能有点矫枉过正)看起来像这样:
File: (\w+)\.java\n(?:.*\n)*?(?:[\w|\s]*?(?: class | interface )\1)
我正在检查的文件的基本形式(尽管已大大简化)如下所示
/*
*
* Copyright 2009
* ...
* File: Bar.java
* ...
*/
package foo
...
import ..
...
/**
* ...
*/
public class Bar
{...}
问题:
当没有找到匹配项时(即当包含“File: Bar.java”的标头被复制到文件 Bat.java 中时)我在很长的文件上收到 StackOverflowError(我的测试用例是@1300 行)。
我已经尝试了几个可视正则表达式测试器,并且可以看到,在不匹配的情况下,当正则表达式引擎通过包含类或接口名称的行时,它会在下一行再次开始搜索并进行一些回溯,这可能会导致 StackOverflowError
问题:
如何通过修改正则表达式来防止 StackOverflowError
是否有某种方法可以修改我的正则表达式,以便在不匹配的情况下 (即,当包含“文件:Bar.java”的标头被复制到文件 Bat.java 中时)匹配将在检查包含的行时停止接口或类名,并看到“\1”与第一组不匹配。
或者,如果可以做到这一点,是否可以最小化在检查包含接口或类的行之后发生的搜索和匹配,从而最小化处理和(希望)StackOverflow 错误?