수색…


원시 문자열 리터럴

가독성 (그리고 당신의 온전한)이 탈출을 피해 피하는 것이 가장 좋습니다. 그것이 원시 문자열 리터럴이 들어오는 곳입니다. (일부 언어에서는 분리 문자를 사용할 수 있습니다. 문자열은 일반적으로 문자열보다 선호되지만 다른 부분이 있습니다.)

그들은 대개이 답변이 설명 하는 것과 같은 방식으로 작동합니다.

[A] 백 슬래시 \ 는 "백 슬래시"를 의미합니다 (단, 리터럴을 종료하는 따옴표 바로 앞에 오는 경우 제외). 줄 바꿈, 탭, 백 스페이스, 양식 피드를 나타내는 "이스케이프 시퀀스"없음 , 등등.

모든 언어가 이들을 가지고있는 것은 아니며 다양한 구문을 사용하는 언어도 있습니다. C #은 실제로 그것들을 축 어적 문자열 리터럴 이라고 부릅니다. 그러나 똑같은 것입니다.


파이썬

pattern = r"regex"
pattern = r'regex'

C ++ (11+)

이 구문은 매우 다양합니다. 유일한 규칙은 정규식의 어느 곳에도 나타나지 않는 구분 기호를 사용하는 것입니다. 그렇게하면 문자열에있는 내용을 이스케이프 처리 할 필요가 없습니다. 괄호 () 는 정규 표현식의 일부가 아닙니다.

pattern = R"delimiter(regex)delimiter";

VB.NET

그냥 정상적인 문자열을 사용하십시오. 백 슬래시는 항상 리터럴 입니다.

기음#

pattern = @"regex";

이 구문도합니다 수 있습니다 "" 의 이스케이프 된 형태로 (두 개의 큰 따옴표) " .

문자열

대부분의 프로그래밍 언어에서 문자열 리터럴로 생성 된 문자열에 백 슬래시를 사용하려면 문자열 리터럴에서 각 백 슬래시를 두 배로 늘려야합니다. 그렇지 않으면 다음 문자에 대한 이스케이프로 해석됩니다.

불행히도, 정규식에 필요한 백 슬래시는 리터럴 백 슬래시 여야합니다. 따라서 정규 표현식이 문자열 리터럴에서 생성 될 때 "이스케이프 이스케이프"( \\ )가 필요합니다.

또한 문자열 리터럴의 인용 부호 ( " 또는 ' )는 이스케이프 처리해야 할 수도 있습니다. 일부 언어에서는 문자열에 대해 두 가지 스타일을 사용할 수 있습니다. 전체 문자열 리터럴 이스케이프).

일부 언어 (예 : Java <= 7)에서는 정규 표현식을 /\w/ 와 같은 리터럴로 직접 표현할 수 없습니다. 문자열에서 생성되어야하며 일반적으로 문자열 리터럴이 사용됩니다 (이 경우 "\\w" . 이러한 경우 따옴표, 백 슬래시 등과 같은 문자가 이스케이프되어야합니다. 이 작업을 수행하는 가장 쉬운 방법은 RegexPlanet 과 같은 도구를 사용하는 것입니다. 이 특정 도구는 Java 용으로 설계되었지만 비슷한 문자열 구문을 사용하는 모든 언어에서 작동합니다.

어떤 문자를 이스케이프해야합니까?

문자 이스케이프는 입력 문자열에서 문자를 검색하고 찾을 수있는 특정 문자 (검색을 조작하기 위해 정규식 엔진에 의해 예약 됨)를 허용하는 것입니다. 이스 케이 핑은 컨텍스트에 따라 다르므로이 예제는 이스케이프 문자열 이나 구분 기호를 포함하지 않습니다.

백 슬래시

역 슬래시가 "이스케이프"문자라고 말하는 것은 약간 오도하는 것입니다. 백 슬래시 이스케이프와 백 슬래시가 나타납니다. 그것은 실제로 메타 문자의 앞이나 뒤에있는 문자의 문자 상태를 켜거나 끕니다.

정규 표현식 어디에서나 리터럴 백 슬래시를 사용하려면 다른 백 슬래시로 이스케이프 처리해야합니다.

이스케이프 (문자 클래스 외부)

글자 그대로 (최소한 char 클래스 외부에서는) 가져 오기 위해 이스케이프 처리해야하는 문자가 몇 가지 있습니다.

  • 괄호 : []
  • 괄호 : ()
  • 중괄호 : {}
  • 운영자 : * , + , ? , |
  • 앵커 : ^ , $
  • 기타 : . , \
  • 정규식 끝 부분에 리터럴 ^ 또는 리터럴 $ 를 사용하려면 문자를 이스케이프 처리해야합니다.
  • 어떤 맛은 정규 표현식의 처음이나 끝에있을 때 ^$ 만 메타 문자로 사용합니다. 이러한 맛에서는 추가적인 도피가 필요하지 않습니다. 그것은 어쨌든 그들을 탈출하는 것이 가장 좋습니다.

문자 클래스 내에서 이스케이프 처리하기

  • 대괄호 ( [] )가 char 클래스의 리터럴로 표시되면 대괄호 ( [] )를 이스케이프 처리하는 것이 가장 좋습니다. 특정 조건에서는 맛에 따라 필요하지 않지만 가독성이 떨어집니다.
  • 탈자 기호 ^ 는 char 클래스의 첫 번째 문자 인 [^aeiou] 넣을 때 메타 문자입니다. char 클래스의 다른 곳에서는 문자 그대로입니다.
  • 대시 ( - )는 문자 클래스의 시작 또는 끝 부분에 있지 않는 한 메타 문자입니다. char 클래스의 첫 번째 문자가 캐럿 ^ 이면 char 클래스의 두 번째 문자 인 경우 리터럴이됩니다.

대체 이스케이프

교체 내에서 탈출하는 규칙도 있지만 위의 규칙 중 어느 것도 적용되지 않습니다. 유일한 메타 문자는 $\ . 캡처 그룹 (예 $1 그룹 1의 경우 $1 을 참조하는 데 $ 사용할 수있는 최소 시간입니다. 리터럴 $ 를 사용하려면 \$5.00 이스케이프 처리하십시오. 마찬가지로 \ : C:\\Program Files\\ .


BRE 예외

ERE (확장 정규식)는 일반적인 Perl 스타일 구문을 반영하지만 BRE (기본 정규 표현식)는 이스케이프와 관련하여 중요한 차이점이 있습니다.

  • 다른 약식 구문이 있습니다. \d , \s , \w 등은 모두 사라졌습니다. 대신 같은 (POSIX가 혼동 "문자 클래스"를 호출) 자신의 구문은 [:digit:] . 이러한 구조는 문자 클래스 내에 있어야합니다.
  • 정상적으로 사용할 수있는 메타 문자 ( . , * , ^ , $ )는 거의 없습니다. 다른 모든 메타 문자는 다르게 이스케이프해야합니다.

교정기 {}

  • a{1,2} 와 일치 a{1,2} . a 또는 aa 와 일치 시키려면 a\{1,2\}

괄호 ()

  • (ab)\1 은 캡처 그룹 1이 없으므로 유효하지 않습니다.이를 수정하고 abab 과 일치 시키려면 \(ab\)\1

백 슬래시

  • char 클래스 (POSIX에서는 대괄호 표현식이라고 함) 내부에서 백 슬래시는 메타 문자가 아니기 때문에 이스케이프가 필요하지 않습니다. [\d]\ 또는 d 와 일치합니다.
  • 다른 곳에서는 평소대로 탈출하십시오.

다른

  • +? 리터럴입니다. BRE 엔진이 메타 문자로 메타 문자를 지원하면 \? 이스케이프해야합니다 \?\+ .

/ 구획 문자 /

많은 언어가 정규식을 몇 가지 특정 문자 (보통 슬래시 ( / 사이에 묶거나 구분할 수 있습니다.

구분 기호는 이스케이프에 영향을 미칩니다. 구분 기호가 / 와 정규식에서 / 리터럴을 찾아야하는 경우 리터럴 ( \/ )이되기 전에 슬래시를 이스케이프 처리해야합니다.

지나치게 이스케이프 처리하면 가독성이 떨어 지므로 사용 가능한 옵션을 고려해야합니다.

Javascript는 슬래시를 구분 기호로 사용할 수 있기 때문에 고유합니다 (문자열이 지정된 정규 표현식을 사용할 수는 있지만).

1

예를 들어 Perl은 거의 모든 것이 구분 기호로 사용할 수 있습니다. 아랍 문자조차도 :

$str =~ m ش ش

특정 규칙은 Perl의 문서에 언급되어 있습니다 .

PCRE는 두 가지 유형의 분리 문자를 허용합니다 : 일치하는 분리 문자 및 대괄호 스타일 분리 문자. 일치하는 구분 기호는 한 문자의 쌍을 사용하며 괄호 스타일 구분 기호는 시작 및 종료 쌍을 나타내는 두 문자를 사용합니다.

  • 일치하는 구분 기호 : !"#$%&'*+,./:;=?@^_`|~-
  • 브래킷 스타일 구분 기호 : () , {} , [] , <>


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow