【发布时间】:2009-11-25 21:26:23
【问题描述】:
你好,
背景:
我正在使用带有 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 错误?
【问题讨论】:
-
你谷歌堆栈溢出并得到这个网站吗?
-
不,我从 Coding Horror 开始就一直在读,所以我知道;只是到目前为止还没有一个好问题。
标签: regex checkstyle