문제

안녕하십니까,

배경:

REGEXP Checker 모듈과 함께 CheckStyle 4.4.2를 사용하여 Out 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의 이전 부분이 일치 한 줄로 많은 역 추적이 발생합니다.

욕심 많은 점이 파일 끝까지 모든 것을 올려 놓고 (빠른) 단어 나 공백/탭으로 시작하는 줄을 찾을 때까지 (그러나 최신 라인이 없음) 라인을 찾을 때까지 역 추적하면 class 또는 interface 그리고 1, 그것은 많은 스택 공간이 필요하지 않습니다.

다르고 아마도 더 나은 솔루션은 문제를 부분으로 나누는 것입니다.

먼저 일치합니다 File: (\w+)\.java 부분. 그런 다음 두 번째 검색을 수행하십시오 ^[\w \t]+(?:class|interface) 게다가 \1 같은 파일의 첫 번째 검색에서 일치합니다.

다른 팁

후속 조치 :

나는 위의 Tim Pietzcher의 제안을 꽂았고 그의 탐욕스러운 해결책은 실제로 더 빨리 실패했으며 일치하지 않았을 때 Stackoverflowerror 없이는 실패했습니다. 그러나 긍정적 인 경우에는 Stackoverflowerror가 여전히 발생했습니다.

소스 코드를 살펴 보았습니다 regexpcheck.java. 클래스 패턴은 라인 터미네이터 또는 입력 순서의 끝이 각각 또는 직전에 또는 직전에 표현식 ^ 및 $와 일치하도록 멀티 라인 모드로 구성됩니다. 그런 다음 전체 클래스 파일을 문자열로 읽고 패턴을 재귀적인 검색합니다 (findmatch () 참조). 그것은 의심 할 여지없이 stackoverflowexception의 소스입니다.

결국 Maven 2가 Maven-Checkstyle-Plugin-2.4/CheckStyle 5.0을 발표 한 이후 약 6 주 전에 우리는 도구를 업그레이드하기로 결정한 이후로 작동하지 않았습니다. 이것은 stackoverflowerror 문제를 해결하지 못할 수 있지만 누군가가 우리가 이것을 다시 추구해야한다고 결정할 때까지 다른 일을 줄 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top