>  기사  >  백엔드 개발  >  PHP - PCRE 정규식 성능

PHP - PCRE 정규식 성능

伊谢尔伦
伊谢尔伦원래의
2016-11-21 17:08:471234검색

패턴의 일부 항목은 다른 항목보다 효율적일 수 있습니다. 예를 들어, [aeiou]와 같은 문자 클래스를 사용하는 것이 선택적 경로(a|e|i|o|u)보다 더 효율적입니다. 일반적으로 요구사항은 가능한 가장 간단한 구성으로 설명될 때 가장 재미있습니다. Jeffrey Friedl의 책(Mastering Regular Expressions)에는 정규식 성능에 대한 많은 논의가 포함되어 있습니다.

패턴이 .*로 시작하고 PCRE_DOTALL 옵션이 설정된 경우 패턴은 문자열의 시작 부분과 일치하므로 PCRE에 의해 암시적으로 고정됩니다. 그러나 PCRE_DOTALL이 설정되지 않은 경우 .메타 문자는 줄 바꿈과 일치할 수 없기 때문에 PCRE는 이 최적화를 수행할 수 없으며 대상 문자열에 줄 바꿈이 포함된 경우 패턴은 시작 부분이 아닌 줄 바꿈 이후에 일치를 시작할 수 있습니다. 예를 들어 패턴(.*) second는 대상 문자열 "firstnand second"(n은 개행 문자)와 일치하며 첫 번째로 캡처된 하위 그룹 결과는 "and"입니다. 이를 위해 PCRE는 대상 문자열의 각 개행 문자 뒤에서 시작하여 일치를 시도합니다.

개행 없이 대상 문자열과 일치하는 패턴을 사용하는 경우 최상의 성능을 위해 PCRE_DOTALL 또는 ^.*로 시작하는 패턴을 설정하여 앵커링을 명시적으로 나타낼 수 있습니다. 이렇게 하면 PCRE가 대상 문자열을 따라 줄 바꿈을 찾아 다시 시작하는 시간을 절약할 수 있습니다.

패턴 내 무한 반복 중첩에 주의하세요. 일치하지 않는 문자열에 적용하면 실행 시간이 길어질 수 있습니다. 패턴 조각 (a+)*를 고려해보세요.

이 패턴은 "aaaa"와 33가지 방법으로 일치할 수 있으며, 이 숫자는 문자열의 길이가 증가함에 따라 급격히 증가합니다. (*반복은 0,1,2,3,4번 일치할 수 있으며 각 경우에 +는 0을 제외하고 일치하는 수가 다릅니다). 패턴의 나머지 부분으로 인해 전체 일치가 실패하는 경우 PCRE는 원칙적으로 가능한 모든 변형을 시도하므로 시간이 많이 걸릴 수 있습니다.

일부 간단한 경우의 최적화는 (a+)*b와 같이 원래 문자열을 즉시 사용하는 것입니다. PCRE는 정식 매칭 작업을 시작하기 전 대상 문자열 뒤에 "b" 문자가 있는지 확인하고 없으면 즉시 실패합니다. 단, 바로 뒤에 나오는 오리지널 캐릭터가 없는 경우에는 이 최적화를 사용할 수 없습니다. (a+)*d 와 위 패턴의 동작 차이를 비교하고 관찰할 수 있습니다. 전자는 전체 행에서 "a"로 구성된 문자열에 적용하면 거의 즉시 실패를 보고하는 반면, 후자는 대상 문자열이 20자를 초과하는 경우 상당한 시간을 소모합니다.


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.