2013-06-08 2 views
0

JBehave 라이브러리에 몇 가지 문제가있었습니다. 그리고 그들은 JRE를 CPU 작업에 집어 넣어 정규 표현식을 사용했습니다.Regex matching 내 JVM을 막혔습니다

표현식이 (.*?)?(\{((.*?)(\|)?)*?\})(.*)이고 create entity of type $entityType {set properties $propertyNames to values $propertyValues과 일치합니다. 닫지 않은 둥근 괄호에주의하십시오.

위 표현을 최적화하거나 정상적으로 처리 할 수있는 방법이 있습니까?

+1

'. * \ {. * \}. *'과 (과) 큰 차이점이 없습니다. 반복에서 특별한 요소가 필요하다면'find'를 사용하면 하위 표현식을 검색 할 것입니다. –

+0

정규 표현식의 목표는 무엇입니까? –

+0

@CasimiretHippolyte, 실제로는 광산이 아닙니다. JBehave의 코드에서이 패턴을 발견했으며 가능한 패턴에서 매개 변수를 추출하려고합니다. – Vic

답변

2

는 (같은 캡처와) 같은 일을이 패턴을 사용해보십시오. 그렇기 때문에 캐릭터 클래스를 소유 한정어로 제한하여 지연 수량자를 대체 한 이유입니다.

하지만 최종 목표를 제시하지 않았으므로 더 나은 패턴을 제공 할 수는 없습니다.

+0

'++ '를'+','* +'를'*'로 바꾸고 싶을 수도 있지만, 그렇지 않으면 좋은 것이다. 접근. –

+0

변경 사항을 제안하면 결과가 더 느려집니다. 여기의 목표는 엔진을 역 추적 할 수 없도록하는 것입니다. –

+0

아, 그들은 역 추적 버전이 아닙니까? 나는 항상 그걸 잊어 버린다. 다른 한편, 적절한 세트를 사용하면 엔진이 스스로 역행 할 필요가 없다는 것을 알아낼 수 있습니다. –

2

이것은 루프가 아니며, 실패보다 빠르다는 것입니다. 가정 무엇

((.*?)(\|)?)*? 

처음 *?와 두 번째 일치되는 : 원인은이 부분입니까? 실패의 경우, 정규식 엔진은 모두 조합으로 시도해야합니다. (물론 DFA 엔진은 아니지만 Java 정규식 엔진은 NFA입니다.)

이제 정규 표현식을 작성할 수 있도록이 정규식과 일치해야하는 내용을 말해야합니다.

그리고이 때문에 게으른 수량 화가가 빨기 때문입니다.

([^\n{]*+)(\{(([^|}]++)(\|)?+)*+\})([^\n]*+) 

여기 아이디어는 가능한 한 빨리 실패하는 것입니다

+0

스택 기반 엔진 수 있습니다. 탐욕스러운 재향 군인회와 동일한 행동을 취하지 만 일어날 수있는 약간 다른 방법이 필요합니다. 오토 마타 이론 접근법은 다른 문제가있다. (하나는 디버그하는 것이 끔찍하다!) –