2016-06-22 4 views
0

내 RegEx ^(?>A|.)*CABC 문자열을 포함한 일부 일치 항목을 제공합니다 (here 참조).RegEx 역 추적

디버거 탭에서 엔진이 성공적으로 일치하려고 시도하는 모든 단계가 표시되지만 이유를 찾을 수없고 일부 단계가 수행되는 이유를 알 수 없습니다. 내 질문은 아래 그림과 같습니다

enter image description here

답변

2

나는 혼란 스럽습니다. 역 추적 (backtracking)에 관해 이야기 할 때, 우리는 정규 표현식 엔진이 이전에 소비 한 문자를 포기하면서 텍스트를 뒤로 이동한다는 것을 의미합니다. 정규 표현식에서 C이 일치 할 수 있도록 정규 표현식은 (?>A|.)*C을 포기해야하는 단계 14에서 한 번만 수행합니다.

그러나 디버거는 뭔가 일치 시키려고 시도하는 단계에 BACKTRACK 레이블을 적용합니다. 그것은 단계 6, 9 및 12에서 AB과 일치시키고 다음으로 C으로 시도한 다음 아무 것도 (문자열의 끝) 시도합니다. 물론, .과 일치시키려는 이유가있는 단계 13에서 BACKTRACK이라는 레이블을 붙여야합니다.

RegexBuddy의 디버거는이 단계를 백 트랙으로 지정합니다. 여기 출력은 다음과 같습니다

RegexBuddy debugger output

당신이 나와 적은 단계는하지만 밖으로 떠나 무엇을 묻지 않는 볼 수 있습니다. RegexBuddy는 Regex101이 너무 많은 정보를 제공하는지 여부를 판단하기에는 너무 적은 정보를 제공합니다. : P

원자 그룹이 예제에서 전혀 영향을 미치지 않습니다. 캡처하지 않는 그룹으로 전환하면 출력이 완전히 동일 해집니다. (DEMO) 효과가 있는지 보려면 내부에 원자 그룹을 넣으십시오. (DEMO)

+0

앨런 감사합니다. 내 질문을하기 전에 RegexBuddy도 확인했는데 잘 지적했다. 사진의 첫 번째 질문으로 * 왜 여기에 백 트랙을 사용해야합니까? *, 내 비전 엔진에서 의미하는 것은 전혀 필요하지 않은 추가 단계가 필요합니다. 나는'B' 엔진을 매치 한 후에 역 추적해야만하고'C'와 일치하도록 앞으로 나아갈 이유가 없다. 내가 '8'단계에서 '14'단계로 그려서 이것이 끝났어야하는 방법이라고 말할 수있다. 너는 나를 바로 잡을지도 모른다. – revo

+0

그룹은 한 번에 한 글자 만 매치 할 수 있으며, 처음으로 'A'를 먼저 시도해야합니다. –

+0

예, 알겠습니다. 이러한 디버깅 팁을 연구 할 몇 가지 출처가 있습니까? – revo

2

(?> )*가 자동으로 멀리 그룹 내부에 토큰에 의해 기억 모든 역 추적 위치를 던졌습니다 원자단. 로서 : 그것은 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 
+0

감사합니다.하지만이 단계는 사람이 읽을 수있는 방법으로 번역되었으므로 내 질문에 대한 대답이 아닙니다. 나는 왜이 단계들을 취했는지 물었다. 경기가 끝나기 위해 8 단계를 거친 후 엔진이 'C'와 일치하지 않는 이유는 무엇입니까? 나는 너의 아홉 번째 설명 된 단계도 이해할 수 없다. ('B'와 일치하면 표현식은'C'와'A'를 일치시킵니다.)'A'와 함께하는 이유는 무엇입니까?) – revo

+0

나는 무슨 일이 일어나는지 살피기 위해 질문을 업데이트했습니다. –

+0

고마워요 @ 로요 미 – revo