정규 표현식에서 .*와 *의 차이점

정규 표현식에서 .*와 *의 차이점

다음을 포함하는 "test"라는 파일이 있습니다.

linux
Unixlinux
Linuxunix
it's linux
l...x

이제 :를 사용하면 grep '\<l.*x\>'다음과 일치합니다.

linux
it's linux
l...x

하지만 을 사용하면 grep '\<l*x\>'다음과만 일치합니다.

l...x, 그러나 참조 가이드에 따르면 *를 사용하면 앞의 항목이 0회 이상 일치합니다. 즉, 'l'로 시작하고 'x'로 끝나는 항목과 일치해야 합니다.

예상한 결과가 표시되지 않는 이유를 설명할 수 있는 사람이 있습니까? 아니면 제가 잘못 이해하고 있는 것입니까?

답변1

상징(.*)

정규 표현식의 *와 *는 문자당 문자 수가 아니라 개수를 의미하며 더 정확하게는 의미합니다."0개 이상". 또한,.방법'모든 단일 문자'.

그래서 그것들을 합치면"0개 이상의 문자가 있습니다.". 예를 들어 다음과 같은 문자열은 다음과 같습니다.

  • 리눅스
  • 린 Nx
  • lnx
  • 하이리눅스
  • 럭스

로 일치합니다 <l.*x>. 마지막 항목이 중요함을 나타냅니다..*역시 일치할 수 없습니다.

상징(*)

내가 말했듯이 *만이 카운터입니다. 따라서 문자 뒤에 넣으면 다음과 같습니다.'엘'* 말한다'0개 이상의 l'.

를 grep하면 l*x과 일치 l...x하지만 생각하는 방식과 다를 수도 있습니다.

% echo "l...x" | grep "l*x"
l...x

후행 "x"와 일치합니다. "l"은 "x" 앞에 "x"가 있다는 점을 제외하면 일치 이유와 아무 관련이 없습니다.'0개 이상의 l'.

답변2

"l"로 시작하고 "x"로 끝나는 모든 항목을 일치시키려면 정규식 "l.*x"를 사용해 보세요. 여기서 "." "*" 및 "*"는 각각 유효한 단일 문자와 길이가 0 이상인 문자를 나타내는 특수 문자입니다. 여기서 "*" 앞에는 "."이 있으므로 "."를 대체할 수 있는 항목은 무엇이든 가능합니다. 위의 "*" 정의에 따라 반복합니다.

답변3

쉘(예: bash)의 경우 clown이 파일 이름을 일치시키는 데 사용되고 문자 자체인 경우 문자를 나타냅니다 *.?

반면, 정규 표현식의 경우 , *, (발생 범위) 및 ( 만) ?은 그 자체로는 아무것도 아닙니다. 항상 이전 문자/원자를 참조합니다. 실제 문자(예: 또는 ) 인지 여부에 관계없이 (조커)는 모든 문자, 문자 범위(예: ) 또는 여러 문자의 패턴(egrep만 해당, 예: - where " 아바"는 하나의 단위로 간주됩니다). 따라서 그 자체로 는 아무 의미가 없지만 이전 문자(하나의 단위로 간주되는 사람 또는 그룹의 광대일 수 있음)가 몇 번 반복되어야 하는지 알려주세요.{n,m}+egrepL5.[a-f](abba)*?

*쉘과 정규 표현식이 및 를 사용하는 방식의 차이점을 기억하고 나면 ?이해가 될 것입니다 .

따라서 정규 표현식의 경우:

  • .- 모든 문자의 정확히 한 번 발생을 나타냅니다.
  • a..a- 두 개의 a와 그 사이의 모든 유형의 두 문자와 일치합니다.
  • .*- 모든 문자가 0개, 1개 이상 일치합니다.
  • B*- "B"가 0, 1개 이상 일치합니다.

관련 정보