내 RegEx ^(?>A|.)*C
에 ABC
문자열을 포함한 일부 일치 항목을 제공합니다 (here 참조).RegEx 역 추적
디버거 탭에서 엔진이 성공적으로 일치하려고 시도하는 모든 단계가 표시되지만 이유를 찾을 수없고 일부 단계가 수행되는 이유를 알 수 없습니다. 내 질문은 아래 그림과 같습니다
내 RegEx ^(?>A|.)*C
에 ABC
문자열을 포함한 일부 일치 항목을 제공합니다 (here 참조).RegEx 역 추적
디버거 탭에서 엔진이 성공적으로 일치하려고 시도하는 모든 단계가 표시되지만 이유를 찾을 수없고 일부 단계가 수행되는 이유를 알 수 없습니다. 내 질문은 아래 그림과 같습니다
나는 혼란 스럽습니다. 역 추적 (backtracking)에 관해 이야기 할 때, 우리는 정규 표현식 엔진이 이전에 소비 한 문자를 포기하면서 텍스트를 뒤로 이동한다는 것을 의미합니다. 정규 표현식에서 C
이 일치 할 수 있도록 정규 표현식은 (?>A|.)*
이 C
을 포기해야하는 단계 14에서 한 번만 수행합니다.
그러나 디버거는 뭔가 일치 시키려고 시도하는 단계에 BACKTRACK 레이블을 적용합니다. 그것은 단계 6, 9 및 12에서 A
을 B
과 일치시키고 다음으로 C
으로 시도한 다음 아무 것도 (문자열의 끝) 시도합니다. 물론, .
과 일치시키려는 이유가있는 단계 13에서 BACKTRACK이라는 레이블을 붙여야합니다.
RegexBuddy의 디버거는이 단계를 백 트랙으로 지정합니다. 여기 출력은 다음과 같습니다
당신이 나와 적은 단계는하지만 밖으로 떠나 무엇을 묻지 않는 볼 수 있습니다. RegexBuddy는 Regex101이 너무 많은 정보를 제공하는지 여부를 판단하기에는 너무 적은 정보를 제공합니다. : P
원자 그룹이 예제에서 전혀 영향을 미치지 않습니다. 캡처하지 않는 그룹으로 전환하면 출력이 완전히 동일 해집니다. (DEMO) 효과가 있는지 보려면 내부에 원자 그룹을 넣으십시오. (DEMO)
(?> )*
가 자동으로 멀리 그룹 내부에 토큰에 의해 기억 모든 역 추적 위치를 던졌습니다 원자단. 로서 : 그것은 7 .
가 B
일치하고 원자단 모두 위치
8 단계 철수 방울 (0 회 이상 (가능한 가장 많은 매칭))
단계와 일치한다 (그리고 이후에 역행하지 않음) 인간이 문자열을 읽으면 쉽게 찾을 수 있으며 원본 문자열의 마지막 문자는 C
이지만 일반 표현식 엔진은 엔진이 문자 테스트를 계속하도록하는 욕심 많은 *
을 보게됩니다. 이 시점에서 엔진은 문자열에서 C
을 볼 수 없으므로 문자가 마지막 문자이기 때문에 역 슬래시를 사용하여 C
을 포함하려고 시도해야합니다. 그러면 9-9 단계의 추가 단계가 발생합니다.
Step 9 the expression attempts to match the `C` with an `A` but this fails so it backtracks to attempt the alternation
Step 10 the `.` then attempts to match the `C` and succeeds
Step 12 the expression is now testing the end of the string to see if it matches the `A` and fails to match the end of the string
Step 13 the expression tests the end of the string with a `.` and fails so it backtracks
Step 14 it back tracked so that the `C` at the end of your expression will match the `C` in the input string
앨런 감사합니다. 내 질문을하기 전에 RegexBuddy도 확인했는데 잘 지적했다. 사진의 첫 번째 질문으로 * 왜 여기에 백 트랙을 사용해야합니까? *, 내 비전 엔진에서 의미하는 것은 전혀 필요하지 않은 추가 단계가 필요합니다. 나는'B' 엔진을 매치 한 후에 역 추적해야만하고'C'와 일치하도록 앞으로 나아갈 이유가 없다. 내가 '8'단계에서 '14'단계로 그려서 이것이 끝났어야하는 방법이라고 말할 수있다. 너는 나를 바로 잡을지도 모른다. – revo
그룹은 한 번에 한 글자 만 매치 할 수 있으며, 처음으로 'A'를 먼저 시도해야합니다. –
예, 알겠습니다. 이러한 디버깅 팁을 연구 할 몇 가지 출처가 있습니까? – revo