수색…


NFA

NFA (Nondeterministic Finite Automaton) 엔진은 패턴에 의해 구동됩니다 .

원리

정규식 패턴은 트리로 파싱됩니다.

현재 위치 포인터가 입력 문자열의 시작으로 설정되고이 위치에서 일치가 시도됩니다. 성냥이 성사되면, 위치는 문자열의 다음 문자로 증가하고이 위치에서 다른 성냥이 시도됩니다. 이 프로세스는 일치하는 항목이 발견되거나 입력 문자열의 끝에 도달 할 때까지 반복됩니다.

매치 시도마다

알고리즘은 주어진 시작 위치에 대한 패턴 트리를 탐색하여 작동합니다. 트리를 진행하면서 일치하는 문자를 사용하여 현재 입력 위치 를 업데이트합니다.

알고리즘이 현재 위치의 입력 문자열과 일치하지 않는 트리 노드를 발견하면 역 추적 해야합니다. 이 작업은 트리의 부모 노드로 돌아가서 현재 입력 위치를 부모 노드를 입력 할 때의 값으로 재설정하고 다음 대체 분기를 시도하여 수행됩니다.

알고리즘이 트리를 종료하도록 관리하면 성공한 일치를보고합니다. 그렇지 않으면 모든 가능성이 시도되면 일치가 실패합니다.

최적화

Regex 엔진은 대개 더 나은 성능을 위해 몇 가지 최적화를 적용합니다. 예를 들어 일치 항목이 주어진 문자로 시작되어야한다고 판단한 경우 해당 문자가 나타나는 입력 문자열의 해당 위치에서만 일치를 시도합니다.

a(b|c)a 를 입력 문자열 abeacababeacab .

패턴 트리는 다음과 유사 할 수 있습니다.

CONCATENATION
    EXACT: a
    ALTERNATION
        EXACT: b
        EXACT: c
    EXACT: a

경기는 다음과 같이 진행됩니다.

a(b|c)a      abeacab
^            ^

a 가 입력 문자열에서 발견되면이를 소비하고 패턴 트리의 다음 항목 인 alternation으로 진행합니다. 첫 번째 가능성을 시도하십시오 : 정확한 b .

a(b|c)a      abeacab
  ^           ^

b 가 발견되면 교대가 성공하고, 그것을 소비하고 연결의 다음 항목으로 진행합니다. 정확한 a :

a(b|c)a      abeacab
      ^        ^

a 가 예상 위치에서 발견 되지 않습니다 . 교대로 역 추적하고 교대로 처음 입력했을 때의 값으로 입력 위치를 재설정하고 두 번째 대안을 시도하십시오.

a(b|c)a      abeacab
    ^         ^

c 는이 위치에 없습니다 . 연결을 역 추적하십시오. 이 시점에서 시도 할 수있는 다른 방법은 없으므로 문자열 시작 부분에 일치 항목이 없습니다.

다음 입력 위치에서 두 번째 일치 시도 :

a(b|c)a      abeacab
^             ^

a일치하지 않습니다. 다른 위치에서 다음 경기를 시도하십시오 :

a(b|c)a      abeacab
^              ^

행운도 없습니다. 다음 위치로 이동하십시오.

a(b|c)a      abeacab
^               ^

일치하는, 그래서 소비와 교대를 입력 :

a(b|c)a      abeacab
  ^              ^

b 가 일치하지 않습니다. 두 번째 대안을 시도하십시오 :

a(b|c)a      abeacab
    ^            ^

c 일치하므로 소비하고 연결의 다음 항목으로 넘어갑니다.

a(b|c)a      abeacab
      ^           ^

일치, 그리고 나무의 끝에 도달했습니다. 일치하는 항목 신고 :

a(b|c)a      abeacab
                \_/

DFA

DFA (Deterministic Finite Automaton) 엔진은 입력에 의해 구동됩니다 .

원리

이 알고리즘은 입력 문자열을 한 번 검사하고 일치 할 수있는 정규식의 가능한 모든 경로를 기억합니다. 예를 들어 패턴에서 교번이 발생하면 두 개의 새로운 경로가 만들어지고 독립적으로 시도됩니다. 주어진 경로가 일치하지 않으면 설정된 경로에서 삭제됩니다.

시사점

일치하는 시간은 입력 문자열 크기로 제한됩니다. 역 추적은 없으며 엔진은 여러 개의 일치 항목을 동시에 찾을 수 있습니다.

이 방법의 주된 단점은 NFA 엔진 유형과 비교하여 엔진이 지원할 수있는 감소 된 기능 세트입니다.

abadacaa(b|c)aabadaca .

abadaca      a(b|c)a
^            ^        Attempt 1      ==> CONTINUE

abadaca      a(b|c)a
 ^           ^        Attempt 2      ==> FAIL
               ^      Attempt 1.1    ==> CONTINUE
                 ^    Attempt 1.2    ==> FAIL

abadaca      a(b|c)a
  ^          ^        Attempt 3      ==> CONTINUE
                   ^  Attempt 1.1    ==> MATCH

abadaca      a(b|c)a
   ^         ^        Attempt 4      ==> FAIL
               ^      Attempt 3.1    ==> FAIL
                 ^    Attempt 3.2    ==> FAIL

abadaca      a(b|c)a
    ^        ^        Attempt 5      ==> CONTINUE

abadaca      a(b|c)a
     ^       ^        Attempt 6      ==> FAIL
               ^      Attempt 5.1    ==> FAIL
                 ^    Attempt 5.2    ==> CONTINUE

abadaca      a(b|c)a
      ^      ^        Attempt 7      ==> CONTINUE
                   ^  Attempt 5.2    ==> MATCH

abadaca      a(b|c)a
       ^       ^      Attempt 7.1    ==> FAIL
                 ^    Attempt 7.2    ==> FAIL


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow