검색 동작

업데이트: 2007년 11월

.NET Framework 정규식 엔진은 Perl, Python, Emacs 및 Tcl에서 사용하는 엔진과 같이 기존의 NFA(Nondeterministic Finite Automaton) 엔진을 통합하는 역행 정규식 검색 도구입니다. Regex는 awk, egrep 또는 lex에 있는 엔진과 같이 속도는 빠르지만 더 제한된 순수 정규식 DFA(Deterministic Finite Automaton) 엔진과 구별됩니다. 또한 표준화되었지만 속도가 느린 POSIX NFA와도 구별됩니다.

정규식 엔진의 세 가지 종류

이 단락에서는 세 가지 엔진 종류의 장/단점에 대해 간략히 설명하고 .NET Framework 엔진이 기존의 NFA 검색 도구를 구현하는 이유를 설명합니다.

DFA 엔진은 역행 검사를 필요로 하지 않고 결과적으로 동일한 문자를 두 번 테스트하지 않으므로 선형으로 실행됩니다. 또한 가능한 가장 긴 문자열도 찾을 수 있습니다. 그러나 DFA 엔진은 제한된 상태만 포함할 수 있으므로 역참조를 사용하는 패턴은 검색할 수 없으며, 명시적 확장을 구성할 수 없으므로 부분식을 캡처할 수 없습니다.

기존의 NFA 엔진은 "최대" 일치 항목 역행 검사라고 하는 알고리즘을 실행하여 가능한 모든 정규식을 특정 순서로 확장하여 테스트하고 첫 번째 일치 항목을 받아 들입니다. 기존의 NFA는 성공적인 검색을 위해 정규식의 특정 확장을 구성하므로 부분식 일치 및 일치 역참조를 캡처할 수 있습니다. 그러나 NFA는 역행 검사를 수행하므로 서로 다른 경로를 통해 특정 결과를 검색한 경우에는 동일한 결과가 여러 번 나올 수 있습니다. 결과적으로 NFA는 최악의 경우에서 상당히 느리게 실행될 수 있습니다. 또한 기존의 NFA는 첫 번째로 발견된 일치 항목을 받아 들이므로 아직 발견되지 않은 다른 일치 항목(더 긴 문자열)을 아예 생략할 가능성도 있습니다.

POSIX NFA 엔진은 가장 긴 일치 항목을 찾을 때까지 역행 검사를 계속한다는 점을 제외하고는 기존의 NFA 엔진과 같습니다. 결과적으로 POSIX NFA 엔진은 NFA 엔진보다 속도가 느리고 POSIX NFA를 사용하면 역행 검사 순서를 변경하여 긴 문자열보다 짧은 문자열을 우선시할 수 없습니다.

기존의 NFA 엔진은 DFA 또는 POSIX NFA 엔진보다 표현이 다양해서 프로그래머들이 선호합니다. 최악의 경우 실행 속도가 느려질 수 있지만 모호함을 줄이고 역행 검사를 제한하는 패턴을 사용하여 선형 또는 다항 시간으로 일치 항목을 찾도록 엔진을 조정할 수 있습니다.

.NET Framework 엔진 기능

기존 NFA 엔진의 장점을 핵심으로 취하여 .NET Framework 정규식 엔진은 프로그래머가 역행 검사 엔진을 조정할 수 있도록 하는 완전한 구문 집합을 포함합니다. 이러한 구문을 사용하여 일치 항목을 더 빨리 찾거나 다른 항목보다 특정 확장 항목을 우선시할 수 있습니다.

다음과 같은 다른 기능도 있습니다.

  • "최소" 수량자: ??, *?, +?, {n,m}?. 이 수량자는 최소 반복 항목을 먼저 검색하도록 역행 검사 엔진에 지시합니다. 이와 달리 일반적인 최대 수량자는 최대 반복 항목을 먼저 검색합니다.

  • 양성 lookahead. 양성 lookahead를 사용하면 역행 검사 엔진은 부분식을 검색한 후 텍스트의 같은 지점으로 돌아오기 때문에 이 기능은 같은 위치에서 시작하는 여러 패턴을 확인하여 텍스트 전체를 검색하는 데 유용합니다.

  • 음성 lookahead. 음성 lookahead는 부분식과 일치하지 않는 경우에만 식을 검색합니다. 이 기능은 때때로 가능한 경우를 제거하는 식을 사용하는 것이 가능한 경우를 포함하는 식을 사용하는 것보다 간단하기 때문에 검색 정리 작업에 특히 유용합니다. 예를 들어, "non"으로 시작하지 않는 단어보다 "non"으로 시작하는 단어를 찾는 것이 더 간단합니다.

  • 조건부 검색. 조건 검색을 사용하면 엔진은 이전 부분식 검색 결과에 따라 둘 이상의 대체 패턴을 사용하여 검색합니다. 이 기능은, 예를 들어, 부분식에서 이전에 여는 괄호를 캡처링한 경우 닫는 괄호도 검색하는 것과 같은 강력한 형식의 역참조를 가능하게 합니다.

  • 역추적하지 않는 부분식(최대 일치 부분식)입니다. 비역행 검사 부분식을 사용하면 역행 검사 엔진은 포함하는 식과 상관 없이 식이 실행되는 것처럼, 부분식이 해당 부분식에 대해 찾은 첫 번째 일치 항목만 검색하도록 합니다. 이 구문을 사용하지 않는 경우에는 더 큰 식의 역행 검사 결과에 따라 결과 부분식 동작이 변경될 수 있습니다.

  • 오른쪽에서 왼쪽으로 일치 검사. 이 기능은 왼쪽에서 오른쪽으로 검색하는 대신 오른쪽에서 왼쪽으로 검색하는 경우 또는 패턴의 왼쪽 부분보다는 패턴의 오른쪽 부분에서 검색을 시작하는 것이 효과적인 경우에 유용합니다.

  • 양성 및 음성 lookbehind. lookahead와 비슷합니다. 정규식 엔진을 사용하면 오른쪽에서 왼쪽으로 일치 검사를 완벽하게 수행할 수 있으므로 정규식은 무제한 lookbehind를 허용합니다.

참고 항목

기타 리소스

.NET Framework 정규식