그룹화는 단어 경계를 포착합니다.

그룹화는 단어 경계를 포착합니다.

(a\b) \1아래에서는 정규식을 표준 입력 으로 내보내고 grep몇 가지 테스트 문자열을 삽입하겠습니다.

$ grep -E '(a\b) \1'

ab
두번째

굵은 텍스트는 일치를 나타냅니다. 두 번째는 a ab나를 당황하게 만들었습니다. 캡처링 그룹은 문자 그대로 " a문자 다음에 단어 경계가 오는 것"으로 설명할 수 있습니다.

문자열을 처리할 때 a ab정규식 엔진은 문자를 일치시키고 a그 뒤에 "단어 문자"가 없는 것을 확인하여 와 일치합니다 \b. 그런 다음 공백과 일치합니다. 여태까지는 그런대로 잘됐다.

\1그러나 일치 하는지 확인해야 하는데 ab, 내가 아는 한 다음에 aab단어 문자가 있기 때문에 일치하지 않아야 합니다. 무슨 일인지 이해가 안 돼요!


대답을 받아들인 후에도 나는 아직도 무슨 일이 일어나고 있는지 실제로 이해하지 못했다는 것을 깨달았습니다. 위의 예에서 시작하면 다음과 같습니다.

$ cat tests
a bab
a ba
a ab
$ grep -E '(\ba\b) \1' tests
a ab

이는 캡처 그룹에 문자열의 오른쪽 가장자리에 있는 단어 경계를 제외한 모든 것이 포함되어 있음을 말하는데, 이는 아직 이해가 되지 않습니다.

답변1

질문은 \1일치하는 텍스트를 참조하며,아니요정규식. 우리의 경우 일치하는 텍스트는 문자입니다 a. 정규식이 아닌 텍스트 이므로 \1상관하지 않습니다 a.

$ cat file
a a
a ab
$ grep -E '(a\b) \1' file
a a
a ab

\1단어로 만들고 싶다면 단어 경계를 추가하세요.

$ grep -E '(a\b) \1\b' file
a a

\1\b끝에 단어 경계가 필요하기 때문에 \1두 번째 줄은 더 이상 일치하지 않습니다.

\1이것이 정규 표현식이 아니라는 것을 증명하려면 다음을 시도해 보세요.

$ echo '.a' | grep -E '(.)\1'
$ 

하지만:

$ echo '..' | grep -E '(.)\1'
..
$ 

따라서 \1match ..는 .일반적으로 정규 표현식이 활성화되어 모든 문자와 일치하지만 \1마침표만 일치합니다.

문서

~에서GNU grep 매뉴얼:

역참조 '\n', 여기서 n은 단일 숫자입니다.이전에 일치한 부분 문자열과 일치정규식의 괄호로 묶인 n번째 하위 표현식입니다. 예를 들어 "(a)\1"은 "aa"와 일치합니다. 대체와 함께 사용하는 경우 역참조는 그룹이 일치에 참여하지 않으면 전체 일치가 실패하게 만듭니다. 예를 들어, "a(.)|b\1"은 "ba"와 일치하지 않습니다. -e 또는 file('-f file')과 함께 여러 정규 표현식이 제공되면 역참조는 각 표현식에 대해 로컬입니다. [강조하다. ]

관련 정보