[regex] 정규식에서 어떤 특수 문자를 이스케이프해야합니까?

()[]{}|많은 정규 표현식을 구현할 때 ‘ ‘ 와 같은 특수 문자를 피해야한다면 항상 추측하려고 노력하는 데 지쳤습니다 .

예를 들어 Python, sed, grep, awk, Perl, rename, Apache, find 등이 다릅니다. 특수 문자를 피해야 할 때와 그렇지 않아야 할 때를 알려주는 규칙 세트가 있습니까? PCRE, POSIX 또는 확장 정규 표현식과 같은 정규 표현식 유형에 의존합니까?



답변

어떤 캐릭터를 사용해야하고 실제로 탈출하지 않아야하는 캐릭터는 작업중인 정규 표현식에 따라 다릅니다.

PCRE 및 대부분의 다른 소위 Perl 호환 특징의 경우 다음 외부 문자 클래스를 피하십시오.

.^$*+?()[{\|

그리고 이러한 내부 캐릭터 클래스 :

^-]\

POSIX 확장 정규 표현식 (ERE)의 경우 다음 외부 문자 클래스 (PCRE와 동일)를 이스케이프하십시오.

.^$*+?()[{\|

POSIX ERE에서 다른 문자를 이스케이프 처리하면 오류가 발생합니다.

문자 클래스 내에서 백 슬래시는 POSIX 정규식의 리터럴 문자입니다. 당신은 아무것도 탈출하는 데 사용할 수 없습니다. 문자 클래스 메타 문자를 리터럴로 포함하려면 “영리한 배치”를 사용해야합니다. 문자 클래스의 시작과 끝을 제외한 ^를 문자 클래스의 시작 또는 끝에-를 넣어 문자 그대로 일치시킵니다. 예를 들면 다음과 같습니다.

[]^-]

POSIX 기본 정규 표현식 (BRE)에서 다음은 의미를 억제하기 위해 이스케이프해야하는 메타 문자입니다.

.^$*[\

BRE에서 괄호와 중괄호를 이스케이프하면 이스케이프 처리되지 않은 버전이 ERE에서 특별한 의미를 갖습니다. 일부 구현 (예 : GNU)도 이스케이프 할 때 \?와 같은 다른 문자에 특별한 의미를 부여합니다. 그리고 +. . ^ $ * () {} 이외의 문자를 이스케이프 처리하는 것은 일반적으로 BRE의 오류입니다.

문자 클래스 내에서 BRE는 ERE와 동일한 규칙을 따릅니다.

이 모든 것이 머리를 돌리면 RegexBuddy 사본을 가져옵니다 . 작성 탭에서 토큰 삽입을 클릭 한 후 리터럴을 클릭하십시오. RegexBuddy는 필요에 따라 이스케이프를 추가합니다.


답변

최신 RegEx 맛 (PCRE)

C, C ++, Delphi, EditPad, Java, JavaScript, Perl, PHP (preg), PostgreSQL, PowerGREP, PowerShell, Python, REALbasic, Real Studio, Ruby, TCL, VB.Net, VBScript, wxWidgets, XML 스키마, Xojo, XRegExp.
PCRE 호환성은 다를 수 있습니다

    어딘가에: . ^ $ * + - ? ( ) [ ] { } \ |


레거시 RegEx 맛 (BRE / ERE)

awk, ed, egrep, emacs, GNUlib, grep, PHP (ereg), MySQL, Oracle, R, sed를 포함합니다.
PCRE 지원은 이후 버전 또는 확장을 사용하여 활성화 될 수 있습니다

ERE / awk / egrep / emacs

    캐릭터 클래스 외부 : 캐릭터 클래스 . ^ $ * + ? ( ) [ { } \ |
    내부 :^ - [ ]

BRE / ed / grep / sed

    문자 클래스 외부 : 문자 클래스 . ^ $ * [ \
    내부 : ^ - [ ]
    리터럴의 경우 이스케이프하지 마십시오. + ? ( ) { } |
    표준 정규식 동작의 경우 이스케이프합니다.\+ \? \( \) \{ \} \|


노트

  • 특정 캐릭터에 대해 잘 모르면 다음과 같이 벗어날 수 있습니다. \xFF
  • 영숫자 문자는 백 슬래시로 이스케이프 할 수 없습니다
  • 임의의 기호는 PCRE에서 백 슬래시로 이스케이프 할 수 있지만 BRE / ERE는 이스케이프 할 수 없습니다 (필요한 경우에만 이스케이프해야 함). PCRE의 ] -경우 문자 클래스 내에서만 이스케이프해야하지만 단순성을 위해 단일 목록으로 유지했습니다.
  • 인용 표현 문자열은 문자 탈출 주변의 인용문이 있어야하며, 종종 백 슬래시 두 배로 업 (같은 "(\")(/)(\\.)"/(")(\/)(\.)/자바 스크립트)
  • 이스케이프 외에도, 다른 정규식 구현은 다른 수정 자, 문자 클래스, 앵커, 수량 자 및 기타 기능을 지원할 수 있습니다. 자세한 내용은 체크 아웃 regular-expressions.info , 또는 사용 regex101.com를 당신의 표현이 살고 테스트

답변

불행히도 사용중인 언어에 따라 다르기 때문에 실제로 일련의 이스케이프 코드가 없습니다.

그러나, 같은 페이지를 유지 정규 표현식 도구 페이지 또는이 정규 표현식 쪽지은 신속하게 필터의 일을 당신을 돕기 위해 먼 길을 갈 수 있습니다.


답변

불행히도 (and \ ()와 같은 의미는 Emacs 스타일 정규 표현식과 대부분의 다른 스타일 사이에서 바뀝니다.

그래서 당신은 실제로 어떤 스타일을 인용하려고하는지 알아야합니다.


답변

POSIX는 기본 정규 표현식 (BRE) 및 확장 정규 표현식 (ERE)과 같은 정규 표현식의 여러 변형을 인식합니다. 그리고 POSIX에서 표준화 한 유틸리티의 역사적 구현으로 인해 단점이 있습니다.

어떤 표기법을 사용할 때 또는 주어진 명령이 어떤 표기법을 사용하는지에 대한 간단한 규칙은 없습니다.

Jeff Friedl의 Mastering Regular Expressions 책을 확인하십시오 .


답변

실제로는 없습니다. 약 절반 정도의 서로 다른 정규 표현식 구문이 있습니다. 그들은 일반적으로 Perl, EMACS / GNU 및 AT & T로 내려 오는 것처럼 보이지만 항상 놀라고 있습니다.


답변

목록에있는 문자로 간단한 이스케이프를 할 수없는 경우가 있습니다. 예를 들어, 괄호를 이스케이프하기 위해 백 슬래시를 사용하는 것은 sed의 대체 문자열 왼쪽에서 작동하지 않습니다.

sed -e 's/foo\(bar/something_else/'

대신 간단한 문자 클래스 정의를 사용하는 경향이 있으므로 위의 표현식은

sed -e 's/foo[(]bar/something_else/'

나는 대부분의 정규 표현식 구현에서 작동합니다.

BTW 문자 클래스는 꽤 ​​바닐라 정규 표현식 구성 요소이므로 정규 표현식에서 이스케이프 문자가 필요한 대부분의 상황에서 작동하는 경향이 있습니다.

편집 : 아래 의견 후에, 정규식 평가의 동작을 볼 때 유한 상태 오토마타와 비 유한 상태 오토마타의 차이점을 고려해야한다는 사실을 언급했다고 생각했습니다.

정규 표현식에 대한 장인 “유효한 볼 북”(일명 유효 표현식 (일명 Amazon 링크 ))을보고 정규 표현식 엔진 평가 유형의 차이를 느끼고 싶을 수 있습니다.

모든 세계가 PCRE는 아닙니다!

어쨌든 정규 표현식은 SNOBOL에 비해 너무 어색합니다 ! 이제 흥미로운 프로그래밍 과정이었다! Simula에 있는 것과 함께 .

70 년대 후반 UNSW에서 공부하는 기쁨! (-: