문자열에서 패턴을 찾기 위해 정규식과 같은 것을 사용하는 도구를 만들려고합니다 (텍스트 문자열이 아니지만 지금은 중요하지 않습니다). 저는 automata 이론에 익숙합니다. 즉, 기본 정규식을 구현하는 방법을 알고, 문자열이 내 정규식과 일치하는 경우 true 또는 false를 출력합니다. 교과서 방식으로 자동 연산을 시뮬레이트합니다. 어떤 입력 문자가 정규식의 어느 부분과 일치하는지 확인할 수 있습니까?
이 정규식을 나는b
의 앞에 더 이상
a
들과 함께,
b
의 앞에 오는 모든
a
들에 관심이 있어요 말 : 그래서,
a[^a]*b
. 하지만 내 문자열에 이러한 부분이 포함되어 있는지 확인하고 싶습니다. 출력을
a
으로 가져와서 검사 할 수 있도록하고 싶습니다. (실제로 텍스트를 다루는 것이 아닙니다.) 요약
: 그때 출력과 두 번째 a
을 원하는 (a)[^a]*b
입력 문자열 bcadacb
에 그것을 실행의 난과 같이 괄호로 a
을 표시한다고 가정 해 봅시다.
또는 더 일반적으로 입력 문자열의 어떤 문자가 정규식의 어느 부분과 일치하는지 확인할 수 있습니까? 텍스트 편집기에서 어떻게 이루어 집니까? 그들은 경기가 시작된 곳을 적어도 알고 있습니다. 왜냐하면 경기를 강조 할 수 있기 때문입니다. 백 트랙킹 접근법을 사용해야합니까, 아니면 계산적으로 비용이 적고 똑똑한 방법이 있습니까?
편집 : 적절한 뒤로 참조, 즉 괄호로 캡처하고 \ 1 등으로 참조하는 것은 필요하지 않을 수 있습니다. 역 참조 (back reference)는 역 추적 (backtracking) (또는 이와 유사한 것)의 필요성을 소개하고 문제 (IIRC)를 NP 어렵게 만든다는 것을 알고 있습니다. 내 질문은 본질적으로 다음과 같습니다. 캡처 참조 부분이 역 참조없이 적절한 후 참조보다 계산에 덜 비쌉니까?
(a) ([^ a] *) (b)를 말한 다음 각 캡처를보고 무슨 일이 일어나는지 볼 수없는 이유는 무엇입니까? –