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

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

다음을 포함하는 "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개 이상의 문자'. 예를 들어 다음과 같은 문자열은 다음과 같습니다.

  • 리눅스
  • linnnnnx
  • lnx
  • 안녕 리눅스
  • 1x

와 일치할 것<l.*x> . 마지막은 중요합니다..*아무것도 일치할 수 없습니다.

표기법(*)

내가 말했듯이 *만을 사용하는 것은 카운터입니다. 따라서 다음과 같은 문자 뒤에 넣으면'엘'*가 말하고 있는 것'0개 이상의 l'.

에 대해 grep하면 l*x와 일치 l...x하지만 아마도 여러분이 생각하는 이유 때문에 그렇지 않을 것입니다.

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

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

답변2

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

답변3

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

반면에 정규 표현식의 경우 , *, ?( {n,m}발생 범위) 및 +( egrep만)은 그 자체로는 아무것도 아닙니다. 그들은 항상 이전 문자/원자를 참조합니다. 날씨는 실제 문자(예: L또는 5)이고, .모든 문자, 문자 범위(예: [a-f]) 또는 여러 문자의 패턴(egrep만)을 나타낼 수 있는 (조커)입니다. (abba)- 여기서 "아바"는 단위로 간주됩니다. 따라서 *and 는 ?그 자체로는 아무 것도 나타내지 않지만 이전 문자(특정 문자 또는 하나의 단위로 취급되는 그룹에 대한 조커일 수 있음)가 몇 번이나 반복되어야 하는지에 대해 알려줍니다.

쉘과 정규 표현식이 *and 를 사용하는 방식 사이의 이러한 차이점을 기억하고 나면 ?올바른 위치에 있어야 합니다.

따라서 정규식의 경우:

  • .- 어떤 문자든 정확히 한 번 나타나는 것을 나타냅니다.
  • a..a- 두 개의 a와 사이에 있는 모든 종류의 두 문자와 일치합니다.
  • .*- 임의의 문자가 0, 1개 이상 일치합니다.
  • B*- "B"가 0, 1개 이상 일치합니다.

관련 정보