你好,

背景:

我使用的Checkstyle4.4.2与RegExp检查模块,以检测时文件名称中出java源头不匹配的文件的类的名称或接口,他们在其居住。这可能发生在开发一份标题从一个类到另一个不能修改的"文件"的标签。

经常表达的使用在RexExp检查程序已经通过许多化身和(虽然它是可能的矫枉过正,在这一点)看起来是这样的:

File: (\w+)\.java\n(?:.*\n)*?(?:[\w|\s]*?(?: class | interface )\1)

基本形式的文件,我检查(虽然极大地简化)看起来像这样

/*
 *
 *  Copyright 2009
 *  ...
 *  File: Bar.java
 *  ... 
 */
package foo
... 
import ..
...
/**
 * ...
 */
public class Bar
{...} 

问题:

没有找到匹配, (例当一个标题含有"文件:Bar.java"被复制成文件Bat.java )我收到一个StackOverflowError在很长的文件(我的试验情况下是@1300线)。

我已经尝试了好几视经常表达的测试者和可以看到的 不匹配的情况下 当regex引擎传递的行含有类或口的名称,它开始搜索了在下一个线和一些回溯可能会导致StackOverflowError

问题:

如何防止StackOverflowError通过修改的经常表达

是否有某种方式修改我经常表达这样的 不匹配的情况下 (即当一个标题含有"文件:Bar.java"被复制成文件Bat.java )匹配将会停止一次的审查包含的接口或类名称,并认为"\1"不符合第一组。

或者如果这是可以做到的,是能够尽量减少搜索和匹配,发生之后,它审查了包含的接口或分类,从而最大限度地减少处理和(希望)的计算器的错误?

有帮助吗?

解决方案

尝试

File: (\w+)\.java\n.*^[\w \t]+(?:class|interface) \1

点相匹配的所有模式。理由:

[\w\s] (的|不属于这里的)相匹配的任何东西,包括断行。这个结果在很大的回溯回到线前一部分的regex有匹配。

如果你让点贪婪吞噬一切都结束的文件(迅速)和然后回溯直到你找到一个线开头的单词或空格/标签(但没有内容的行),然后 classinterface 并\1,那么,不需要作为大堆的空间。

一个不同的,甚至可能更好的解决将是分裂的问题成部分。

第一场比赛的 File: (\w+)\.java 部分。然后做的第二个搜索 ^[\w \t]+(?:class|interface) 再加上 \1 匹配,第一次搜索就同样的文件。

其他提示

后续:

我插在蒂姆Pietzcher的建议,述及他的贪婪的解决方案的确更快的失败和没有StackOverflowError时没有匹配被发现。然而,在积极的情况下,StackOverflowError仍时有发生。

我看了源代码 RegexpCheck.java.这类模式是建造在多行模式这样的表情^美元匹配后或之前,分别有一线的终止或结束输入序列。然后它会读取整个类文件成一串并且递归搜索模式(见findMatch()).这无疑是源的StackOverflowException.

在结束我没有得到它的工作(放弃)由于家2公布的专家-checkstyle件-2.4/Checkstyle5.0大约6个星期前,我们已经决定升级我们的工具。这可能也解决不了的StackOverflowError问题,但它会给我的东西别上的工作,直到有人决定,我们需要追求这一次。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top