2014-01-31 4 views
0

나는 다음과 같은 코드를 가지고 : 나는 작은 파일의 콘텐츠를 테스트 할 때StackOverflowError가 동안 정규 표현식으로 큰 파일을 처리

String regex = "Some String(.*\r?\n)*.*\\* testing .*\r?\n.*\r?\n.*children.*\r?\n"; 
Pattern p = Pattern.compile(regex); 
System.out.println(p.pattern()); 
String content = readFile(); // it return file content 
Matcher m = p.matcher(content); 

그래서 잘 작동합니다. 그러나 큰 파일 내용으로 내 코드에 다음과 같은 오류가 발생합니다.

java.lang.StackOverflowError 
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4606) 
    at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3715) 
    at java.util.regex.Pattern$Ques.match(Pattern.java:4079) 
    at java.util.regex.Pattern$Curly.match0(Pattern.java:4170) 
    at java.util.regex.Pattern$Curly.match(Pattern.java:4132) 
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4556) 
    at java.util.regex.Pattern$Loop.match(Pattern.java:4683) 
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4615) 
    at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3715) 
    at java.util.regex.Pattern$Ques.match(Pattern.java:4079) 
    at java.util.regex.Pattern$Curly.match0(Pattern.java:4170) 
    at java.util.regex.Pattern$Curly.match(Pattern.java:4132) 
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4556) 
    at java.util.regex.Pattern$Loop.match(Pattern.java:4683) 
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4615) 
    at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3715) 
    at java.util.regex.Pattern$Ques.match(Pattern.java:4079) 
    at java.util.regex.Pattern$Curly.match0(Pattern.java:4170) 
    at java.util.regex.Pattern$Curly.match(Pattern.java:4132) 
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4556) 
    at java.util.regex.Pattern$Loop.match(Pattern.java:4683) 
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4615) 
    at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3715) 
    at java.util.regex.Pattern$Ques.match(Pattern.java:4079) 
    at java.util.regex.Pattern$Curly.match0(Pattern.java:4170) 
    at java.util.regex.Pattern$Curly.match(Pattern.java:4132) 
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4556) 
    at java.util.regex.Pattern$Loop.match(Pattern.java:4683) 
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4615) 
    at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3715) 
    at java.util.regex.Pattern$Ques.match(Pattern.java:4079) 
    at java.util.regex.Pattern$Curly.match0(Pattern.java:4170) 
    at java.util.regex.Pattern$Curly.match(Pattern.java:4132) 
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4556) 
    at java.util.regex.Pattern$Loop.match(Pattern.java:4683) 
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4615) 
    at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3715) 
    at java.util.regex.Pattern$Ques.match(Pattern.java:4079) 
    at java.util.regex.Pattern$Curly.match0(Pattern.java:4170) 
    at java.util.regex.Pattern$Curly.match(Pattern.java:4132) 
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4556) 
    at java.util.regex.Pattern$Loop.match(Pattern.java:4683) 
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4615) 
    at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3715) 
    at java.util.regex.Pattern$Ques.match(Pattern.java:4079) 
    at java.util.regex.Pattern$Curly.match0(Pattern.java:4170) 
    at java.util.regex.Pattern$Curly.match(Pattern.java:4132) 
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4556) 
    at java.util.regex.Pattern$Loop.match(Pattern.java:4683) 
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4615) 
    at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3715) 
    at java.util.regex.Pattern$Ques.match(Pattern.java:4079) 
    at java.util.regex.Pattern$Curly.match0(Pattern.java:4170) 
    at java.util.regex.Pattern$Curly.match(Pattern.java:4132) 
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4556) 
    at java.util.regex.Pattern$Loop.match(Pattern.java:4683) 
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4615) 
    at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3715) 
    at java.util.regex.Pattern$Ques.match(Pattern.java:4079) 
    at java.util.regex.Pattern$Curly.match0(Pattern.java:4170) 
    at java.util.regex.Pattern$Curly.match(Pattern.java:4132) 
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4556) 
    ... 

정규식 엔진이 문제를 발생시키고 있다고 생각합니다. 이것은 중첩 된 한정 기호 때문일 수 있습니다. 그래서 정규식 엔진이 쉽게 처리하는 방식으로 정규식을 최적화 할 수 있습니까?

+0

당신이 일치하는 것을 시도하는지의 예를 게시 할 수 :이 하나와 중복 여러 스택 추적 블록이 곳

이 이론은, 스택 추적에 표시됩니다? – Joni

+0

그리고 자바 버전은 무엇입니까? – PopoFibo

+2

당신은 많은 욕심을 지르는 한정어 ('. *')를 사용하고 있습니다. 제가 시도하고자하는 첫 번째 것은 그들을 꺼리는 것들 ('*?')로 변환하는 것입니다. '.'을'[^ \ r \ n] '로 제한하는 것이 더 나을 것입니다. –

답변

1

가능한 문제는 정규 표현식이 너무 많은 행과 일치한다는 것입니다. 가지고 있기 때문에 :

\r?\n 

여러 번 당신의 기록에 일치 할 수 있습니다.

그래서 :

"Some String(.*\r?\n)*.*\\* testing .*\r?\n.*\r?\n.*children.*\r?\n" 

그렇지 않으면 정규식 엔진이 마지막 레코드까지 처음부터 일치 할 수있을 것입니다,

Some String 


\ testing 



children 


Some String 

당신은 각 레코드를 완료하는 식을 찾을 필요가 일치합니다 그리고 그것은 깨질 수 있습니다.

at java.util.regex.Pattern$Loop.match(Pattern.java:4683) 
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4615) 
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3715) 
at java.util.regex.Pattern$Ques.match(Pattern.java:4079) 
at java.util.regex.Pattern$Curly.match0(Pattern.java:4170) 
at java.util.regex.Pattern$Curly.match(Pattern.java:4132) 
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4556)