(a\b) \1
아래에서는 정규식을 표준 입력 으로 내보내고 grep
몇 가지 테스트 문자열을 삽입하겠습니다.
$ grep -E '(a\b) \1' 아 아 ab 아두번째
굵은 텍스트는 일치를 나타냅니다. 두 번째는 a ab
나를 당황하게 만들었습니다. 캡처링 그룹은 문자 그대로 " a
문자 다음에 단어 경계가 오는 것"으로 설명할 수 있습니다.
문자열을 처리할 때 a ab
정규식 엔진은 문자를 일치시키고 a
그 뒤에 "단어 문자"가 없는 것을 확인하여 와 일치합니다 \b
. 그런 다음 공백과 일치합니다. 여태까지는 그런대로 잘됐다.
\1
그러나 일치 하는지 확인해야 하는데 ab
, 내가 아는 한 다음에 a
는 ab
단어 문자가 있기 때문에 일치하지 않아야 합니다. 무슨 일인지 이해가 안 돼요!
대답을 받아들인 후에도 나는 아직도 무슨 일이 일어나고 있는지 실제로 이해하지 못했다는 것을 깨달았습니다. 위의 예에서 시작하면 다음과 같습니다.
$ 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'
..
$
따라서 \1
match .
.는 .
일반적으로 정규 표현식이 활성화되어 모든 문자와 일치하지만 \1
마침표만 일치합니다.
문서
~에서GNU grep 매뉴얼:
역참조 '\n', 여기서 n은 단일 숫자입니다.이전에 일치한 부분 문자열과 일치정규식의 괄호로 묶인 n번째 하위 표현식입니다. 예를 들어 "(a)\1"은 "aa"와 일치합니다. 대체와 함께 사용하는 경우 역참조는 그룹이 일치에 참여하지 않으면 전체 일치가 실패하게 만듭니다. 예를 들어, "a(.)|b\1"은 "ba"와 일치하지 않습니다. -e 또는 file('-f file')과 함께 여러 정규 표현식이 제공되면 역참조는 각 표현식에 대해 로컬입니다. [강조하다. ]