2010-08-01 2 views
1

Perl 스크립트에서 일부 정규식이 정확하지만 느립니다. 나는 backtracking을 불가능하게하기 위해 + 연산자 대신에 +와 + 대신에 + 연산자를 추가하여 성능을 향상시키는 것을 고려 중이다. 나는 그들 모두를 교체하려고 시도하고 regexes는 작동을 멈췄다. 정규식을 위반하지 않는 곳에 어디에서 추가 할 수 있는지 어떻게 알 수 있습니까? 나는 "관련"열을 찾고, 질문을 게시 일단 정규 표현식에 작동이 중지되면추가하여 Perl 정규 표현식 성능 향상 +

+2

regexp에서 필요로하는 최적화를 게시 할 수 있습니까? 예제를 통해 최적화하면 특정 최적화를 사용해야하는 경우를 더 잘 이해할 수 있습니다. – strager

답변

6

.... 꽤 좋은 아이디어를 가지고있는이를 알려준 경우 중 하나는 '때로 믿을 수 그 (것)들을 지원하는 펄 버전을 사용하거나, 실제로 그러한 경우에 역 추적이 필요합니다.

역 추적을 필요로하지 않을 섹션을 식별합니다 (즉, 특정 포인트에서 시작하기 위해 일치하도록 요청하는 경우 일치시킬 길이가 두 개 이상일 수 없음). (?> ). 이것은 ++/* +와 같은 효과를 가지며 5.10 이전에도 지원됩니다.

역 추적 제한은 "최적화"가 아니므로 일치 여부 및 일치 여부가 변경되므로주의해야합니다. 아이디어는 당신이 실제로 원하는 것을 더 잘 묘사하기 위해 그것을 사용한다는 것입니다. OP의 대답에 링크 된 기사에서 빌려 오는 것은 ^(.*?,){11}P (12 번째 쉼표로 구분 된 필드가 P로 시작 함)과 같은 것이 비효율적이지 않습니다. 역 추적은 열두째 이후의 필드 만 P로 시작하는 경우에도 실제로 일치합니다. ^(?>.*?,){11}P으로 수정하면 올바른 수의 입력란과 실제로 일치하도록 제한됩니다. (이 간단한 경우에는 ^([^,]*,){11}P도 작업을 수행하지만 대체 문자를 사용하여 필드 안에 이스케이프 또는 인용 된 쉼표를 추가하면 (?>이 더 쉬운 선택이됩니다.)