내 정규 표현식이 X에서는 작동하지만 Y에서는 작동하지 않는 이유는 무엇입니까?

내 정규 표현식이 X에서는 작동하지만 Y에서는 작동하지 않는 이유는 무엇입니까?

나는 일부 프로그램(grep, sed, awk, perl, python, ruby, ksh, bash, zsh, find, emacs, vi, vim, gedit, ...)에서 잘 작동하는 정규식을 작성했습니다. 하지만 다른 프로그램(또는 다른 UNIX 변형)에서 사용하면 일치가 중지됩니다. 왜?

답변1

불행하게도 역사적 이유로 인해 도구마다 정규식 구문이 약간씩 다르며 때로는 일부 구현에 다른 도구가 지원하지 않는 확장이 포함되기도 합니다. 공통점이 있지만 각 도구 작성자가 서로 다른 선택을 한 것 같습니다.

결과적으로 정규식이 하나의 도구에서 작동하는 경우 다른 도구에서도 작동하도록 수정해야 할 수도 있습니다. 일반적으로 사용되는 도구 간의 주요 차이점은 다음과 같습니다.

  • 연산자에 +?|(){}백슬래시가 필요한지 여부.
  • .[]*^$기본 기능 외에 일반적으로 어떤 확장이 지원됩니까?+?|()

이 답변에 나는 나열했습니다주요 기준. 자세한 내용은 사용 중인 도구에 대한 설명서를 확인하세요.

위키피디아의정규식 엔진 비교일반적인 구현에서 지원되는 기능을 나열하는 표가 있습니다.

기본 정규식(갈아 바수다)

기본 정규식은 다음과 같이 제공됩니다.POSIX 표준. 사용된 구문은 다음과 같습니다.grep,sed그리고vi. 이 구문은 다음 기능을 제공합니다.

  • ^그리고 $줄의 시작과 끝에서만 일치합니다.
  • .모든 문자(또는 개행 문자를 제외한 모든 문자)와 일치합니다.
  • […]괄호 안에 나열된 문자(문자 세트) 중 하나와 일치합니다. 여는 괄호 뒤의 첫 번째 문자가 ^이면 목록에 없는 문자가 일치됩니다. 를 포함하려면 ]시작 바로 뒤에 배치하세요 [( [^음수 세트인 경우 나중에 배치하세요). -두 문자 사이에 범위를 나타내는 경우 리터럴을 포함하려면 -범위로 구문 분석할 수 없는 위치에 배치하세요.
  • ^$.*\[다음 문자 앞에 오는 백슬래시입니다.
  • *선행 문자 또는 하위 표현식을 0, 1 또는 그 이상 일치합니다.
  • \(…\)*연산자 또는 역참조 및 대체 와 함께 사용되는 구문 그룹입니다 \DIGIT.
  • 역참조 \1, \2, ...는 해당 그룹과 일치하는 정확한 텍스트와 일치합니다(예: \(fo*\)\(ba*\)\1일치 foobaafoo하지만 일치하지 않음) foobaafo. 10번째 및 후속 그룹을 참조하는 표준 방법은 없습니다( 표준 의미는 \10다음에 오는 첫 번째 그룹입니다 0).

다음 기능도 표준이지만 일부 제한된 구현에서는 누락되었습니다.

  • \{m,n\}앞의 문자 또는 하위 표현식과 일치합니다.도착하다N이류;N또는생략 가능하고 정확함\{m\}.
  • 괄호 안에,캐릭터 클래스[[:alpha:]]예를 들어 임의의 문자와 일치시키는 데 사용할 수 있습니다 . 현대적인 구현대괄호 표현)또한 포함됩니다요소 구성like [.ll.]및 동등한 클래스 [=a=].

다음 확장은 일반적이지만(특히 GNU 도구에서) 모든 구현에서 발견되지 않을 수도 있습니다. 사용 중인 도구의 설명서를 확인하세요.

  • \|대체: foo\|bar일치 foo또는 bar.
  • \?( 약어 \{0,1\}) 및 \+( 약어 \{1,\})는 각각 최대 1회 또는 최소 1회 선행 문자 또는 하위 표현식과 일치합니다.
  • \n개행, \t탭 일치 등을 일치시킵니다.
  • \w모든 단어 구성 요소(축약되었지만 [_[:alnum:]]현지화된 변형 포함)와 일치하며 \W단어 구성 요소가 아닌 모든 문자와 일치합니다.
  • \<그리고 \>각각 단어의 시작이나 끝 부분에서만 빈 문자열과 일치합니다. \b일치하거나 일치하지 않는 경우 와 \B일치 합니다.\b

연산자가 없는 도구에는 \|정규식의 전체 기능이 없습니다. 역참조를 사용하면 수학적 의미에서 정규식이 수행할 수 없는 몇 가지 추가 작업을 수행할 수 있습니다.

확장 정규식(오히려)

확장 정규식은 다음과 같이 제공됩니다.POSIX 표준. BRE에 비해 가장 큰 장점은 규칙성입니다. 모든 표준 연산자는 순수한 구두점이며 구두점 앞의 백슬래시는 항상 이를 인용합니다. 사용된 구문은 다음과 같습니다.awk,grep -E또는 egrep, BSD(및 GNU 및 곧 POSIX) sed -E(이전 sed -r에는 GNU sed) 및bash/ksh93/yash/zsh=~운영자. 이 구문은 다음 기능을 제공합니다.

  • ^그리고 $줄의 시작과 끝에서만 일치합니다.
  • .모든 문자(또는 개행 문자를 제외한 모든 문자)와 일치합니다.
  • […]괄호 안에 나열된 문자(문자 세트) 중 하나와 일치합니다. 이니셜 ^및 범위 완성은 BRE와 유사하게 작동합니다(위 참조).캐릭터 클래스사용할 수 있지만 일부 구현에서는 누락되었습니다. 최신 구현에서는 동등한 클래스와 데이터 정렬 요소도 지원합니다. 일부 구현에서는 괄호 안의 백슬래시가 다음 문자를 나타냅니다. \\백슬래시는 이식성을 나타내는 데 사용됩니다.
  • (…)*는 or \DIGIT대신에 사용되는 구문 그룹입니다 .
  • |대체: foo|bar일치 foo또는 bar.
  • *, 선행 문자 또는 하위 표현식을 여러 번 일치합니다(0회 이상 +, 1회 이상 , 0회 또는 1회) .?*+?
  • 다음 문자가 영숫자가 아닌 경우 백슬래시로 묶입니다.
  • {m,n}앞의 문자 또는 하위 표현식과 일치합니다.그리고N시간(일부 구현에서는 누락됨)N또는생략 가능하고 정확함{m}.
  • BRE의 일부 공통 확장: 역참조(특히 비지박스 구현에 사용되는 경우를 제외하고 awk에는 없음), 단어 경계, 단어 구성 요소 등\DIGIT$0 ~ "(...)\\1"\n\t\b\B\b\B

PCRE(Perl 호환 정규식)

PCRE는 원래 ERE가 개발한 ERE의 확장입니다.진주GNU에 의해 채택됨grep -P그리고다양한 최신 도구 및 프로그래밍 언어, 일반적으로 다음을 통해폴리 메라 제 연쇠 반응도서관. 보다펄 문서예제가 포함된 좋은 형식입니다. PCRE는 최신 Perl 버전의 모든 기능을 지원하지 않습니다. 예를 들어 Perl만이 Perl 코드 실행을 지원합니다. 보다PCRE 브로셔지원되는 기능 요약을 확인하세요. ERE에 새로 추가된 주요 사항은 다음과 같습니다.

  • (?:…)비캡처 그룹입니다. 와 유사 (…)하지만 역참조를 계산하지 않습니다.
  • (?=FOO)BAR(Lookahead) match BAR, 그러나 동일한 위치에서 시작하는 일치도 있는 경우에만 해당됩니다 FOO. 이는 일치 항목에 다음 텍스트를 포함하지 않고 일치 항목을 고정하는 데 가장 유용합니다. foo(?=bar)일치 foo하지만 뒤에 가 있는 경우에만 해당됩니다 bar.
  • (?!FOO)BAR(부정 예측) 일치하지만 BAR동일한 위치에 일치하는 항목이 없습니다. FOO예를 들어 ; 로 시작하지 않는 소문자 단어를 (?!foo)[a-z]+일치시킵니다 foo. [a-z]+(?![0-9)뒤에 숫자가 없는 소문자 단어와 일치합니다(따라서 에서는 foo123일치 fo하지만 는 아님 foo).
  • (?<=FOO)BAR(lookbehind)는 match 와 일치 BAR하지만, match 가 바로 앞에 오는 경우에만 해당됩니다 FOO. FOO알려진 길이가 있어야 합니다(예: 반복 연산자를 사용할 수 없음 *). 이는 일치 항목에 이전 텍스트를 포함하지 않고 일치 (?<=^| )foo항목 을 고정하는 데 유용합니다. foo하지만 앞에 공백이 있거나 문자열의 시작 부분에 있는 경우에만 가능합니다.
  • (?<!FOO)BAR(부정적 뒤돌아보기)는 match 와 일치 BAR하지만, match 가 바로 앞에 나오지 않는 경우에만 해당됩니다 FOO. FOO알려진 길이가 있어야 합니다(예: 반복 연산자를 사용할 수 없음 *). 이는 일치 항목에 이전 텍스트를 포함하지 않고 일치 항목을 고정하는 데 유용합니다. (?<![a-z])foomatch foo단, 앞에 소문자가 없는 경우에만 해당됩니다.

이맥스

이맥스 구문BRE와 ERE 사이. Emacs를 제외하면 이는 -regexGNU 찾기의 기본 구문입니다. Emacs는 다음 연산자를 제공합니다:

  • ^, $, ., […], *, +, ?ERE에 표시된 대로
  • \(…\), \|, \{…\},BRE에 표시된 대로\DIGIT
  • 추가 백슬래시 문자 시퀀스; \<\>단어 경계, 그리고 Emacs와 유사한 구문을 사용하는 다른 엔진에서는 종종 지원되지 않는 최신 버전의 Emacs에 있는 더 많은 기능입니다.

껍데기구체

쉘 글로브(와일드카드)는 정규식과 완전히 다르고 덜 강력한 구문을 사용하여 패턴 일치를 수행합니다. 셸 외에도 이러한 와일드카드는 find -namersync 필터와 같은 다른 도구와 함께 사용할 수 있습니다.POSIX 모드다음 기능이 포함되어 있습니다.

  • ?단일 문자와 일치합니다.
  • […]일반적인 정규식 구문의 문자 집합입니다. 일부 쉘은 문자 클래스를 지원하지 않습니다. 일부 쉘에서는 이를 부정하는 !대신 ^이 컬렉션이 필요합니다.
  • *모든 문자 시퀀스와 일치합니다( /일반적으로 파일 경로와 일치하는 경우 제외. /에서 제외된 경우 포함되는 경우도 있지만 *도구 설명서를 확인하세요).**/
  • 백슬래시는 다음 문자를 인용합니다.

Ksh 제안추가 기능이는 정규 표현식의 모든 기능과 일치하는 패턴을 제공합니다. 이러한 기능은 bash에서 실행한 후에도 사용할 수 있습니다 shopt -s extglob. Zsh에는 하나가 있습니다다른 구문그러나 ksh 이후의 구문도 지원할 수 있습니다 setopt ksh_glob.


1 rematchpcre이 옵션을 활성화 하지 zsh않으면 =~PCRE가 사용됩니다. ksh93의 확장 정규식은 둘러보기 연산자와 같은 일부 Perl 확장 연산자도 지원합니다.

관련 정보