정규 표현식의 ^s$가 "s로 시작하고 s로 끝남"과 같은 문자열과 일치하지 않는 이유는 무엇입니까?

정규 표현식의 ^s$가 "s로 시작하고 s로 끝남"과 같은 문자열과 일치하지 않는 이유는 무엇입니까?

^줄의 시작 부분과 일치하고 줄 $의 끝과 일치하면 ^$줄의 시작 부분 이 아닌 이유는 무엇입니까?그리고제목처럼 문자열 끝인가요?

다음과 같이 문자열과 일치하는 정규식을 만드는 방법은 다음과 같습니다.

" 로 시작하고 s로 끝납니다 s."

답변1

그 이유는 정규식 일치가 처리되는 방식에 있습니다(참조:여기예를 들어): 문자열은 왼쪽에서 오른쪽으로 평가되며 역참조를 제외하고 문자열의 모든 기호는 정규식의 토큰(가장 간단한 경우 리터럴 기호 자체)과 일치해야 합니다. 반복 연산자.

핵심은 정규식이 "전체 문자열의 일반 속성"(예: " s시작 및 끝")을 설명하는 것이 아니라 문자열에 규칙을 적용한다는 것입니다.캐릭터 레벨끈. 그래서, 당신의 정규식

^s$

의미: "문자열의 시작", 그 뒤에하나 s, 그 뒤에 "문자열의 끝"이 옵니다. 따라서 이는 단일 문자로 구성된 문자열에만 일치합니다 s. 이는 기술적으로 로 시작하고 끝나는 문자열이지만 s사용자가 찾고 있는 문자열은 아닙니다.

s로 시작하고 , 중간에 문자가 있고, 로 끝나는 문자열 을 일치시키려면 s해당 문자열을 모두 명시적으로 지정해야 합니다.

매우 명확하게 하려면:

  • 첫 번째 반복은 다음과 같습니다.
    ^s.*s$
    
    s이는 " 로 시작 하고 그 뒤에 임의 유형의 0개 이상의 문자( .*)가 오고 마지막으로 s문자열의 끝이 오는 문자열과 일치합니다 .
  • 물론, 이것은아니요다음으로 구성된 문자열과 일치합니다.오직수치 s. 따라서 두 번째 반복에서는 초기 선택적 섹션 뒤에 섹션을 설정합니다 s(@user414777의 설명 참조).
    ^s(.*s)?$
    
    s그러면 "로 시작 하고 0개 또는 1회(the ?) ', 모든 유형의 0개 이상의 문자로 구성된 부분 문자열, s'(의 내용 (...))이 뒤따르고 바로 뒤에 끝나는 문자열"과 일치합니다 .

이제 질문에 로 태그를 지정했다는 것은 아마도 행이나 문자열이 로 시작하고 끝나는 경우에만 적용되는 규칙에 대한 조건을 생성 awk한다는 의미일 것입니다 . 이는 다음과 같을 수 있습니다:awks

awk '/^s/ && /s$/ { ... }'

grep같은그리고- 구축 자체가 불가능함(구문은 다음과 동일함)-e regex1 -e regex2또는), 그러나 파이프를 통해 이를 수행할 수 있습니다.

grep "^s" sourcefile.txt | grep "s$"

관련 정보