Programing

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

lottogame 2020. 2. 28. 18:38
반응형

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


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

예를 들어 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를 당신의 표현이 살고 테스트

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

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


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

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

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


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


불행히도 (and \ ()와 같은 의미는 Emacs 스타일 정규 표현식과 대부분의 다른 스타일 사이에서 바뀝니다. 따라서 이스케이프를 시도하면 원하는 것과 반대되는 작업을 수행 할 수 있습니다.

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


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

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

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

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

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

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

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

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

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

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

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


PHP의 경우 "영숫자가 아닌 문자 앞에"\ "를 붙여서 자체를 나타내는 것이 항상 안전합니다." - http://php.net/manual/en/regexp.reference.escape.php .

"또는"인 경우를 제외하고. : /

PHP에서 정규식 패턴 변수 (또는 부분 변수)를 피하려면 preg_quote ()


문자열이 통과하는 컨텍스트 체인을 정확하게 이해하려면 시도하지 않고 언제 그리고 무엇을 피해야하는지 알아야합니다. 가장 먼 쪽에서 최종 대상까지 문자열을 지정합니다.이 대상은 정규 표현식 구문 분석 코드에서 처리하는 메모리입니다.

메모리의 문자열이 처리되는 방식을 알고 있어야합니다. if는 코드 내부의 일반 문자열이거나 명령 줄에 입력 된 문자열 일 수 있지만 대화 형 명령 줄 또는 셸 스크립트 파일 내에 지정된 명령 줄일 수 있습니다. 코드에서 언급 한 메모리의 변수 내부 또는 추가 평가를 통한 (문자열) 인수 또는 모든 종류의 캡슐화로 동적으로 생성 된 코드가 포함 된 문자열 ...

이 문맥 각각은 특수 기능을 가진 일부 문자를 할당했습니다.

특수 기능 (컨텍스트에 로컬)을 사용하지 않고 문자를 문자 그대로 전달하려는 경우 다음 컨텍스트의 경우 이스케이프 해야하는 경우보다 추가로 필요한 다른 이스케이프 문자가 필요할 수 있습니다. 이전 컨텍스트에서 이스케이프되었습니다. 또한 문자 인코딩과 같은 것들이있을 수 있습니다 (가장 교활한 utf-8은 일반적인 문자의 ASCII처럼 보이기 때문에 선택에 따라 터미널에서도 해석 될 수 있으므로 다르게 행동 할 수 있으므로 HTML의 인코딩 속성) / XML, 프로세스를 정확히 이해해야합니다.

예를 들어 perl -npe,로 시작하는 명령 행의 정규 표현식 은 파일 핸들을 파이프로 연결 하는 일련의 실행 시스템 호출 로 전송되어야 하며,이 실행 시스템 호출 각각은 (이스케이프되지 않은) 공백으로 구분 된 인수 목록 만 가지고 있습니다. 파이프 (|) 및 리디렉션 (> N> N> & M), 괄호, *및의 대화식 확장 ?,$(())... (모든 문자는 * sh에서 사용되는 특수 문자이며 다음 컨텍스트에서 정규 표현식의 문자를 방해하는 것처럼 보일 수 있지만 순서대로 평가됩니다. 명령 행 앞. 명령 행은 프로그램은 bash / sh / csh / tcsh / zsh와 같이 기본적으로 큰 따옴표 또는 작은 따옴표 안에 이스케이프가 더 간단하지만 명령 행에서 문자열을 인용 할 필요는 없지만 대부분 공백은 백 슬래시로 시작해야하며 따옴표는 * 및? 문자에 대한 확장 기능을 사용할 수있는 상태로 둘 필요는 없지만 인용 부호와 다른 컨텍스트로 구문 분석 한 다음 명령 행을 평가할 때 (명령 행에 기록되지 않은) 메모리에서 얻은 정규 표현식이 동일한 처리를 수신합니다. 정규 표현식의 경우 대괄호 [] 안에 문자 세트 컨텍스트가 있습니다.펄 정규 표현식은 큰 비 알파 숫자 문자 (예 : m // 또는 m : / better / for / path : ...)로 인용 할 수 있습니다.

다른 답변의 문자에 대한 자세한 내용은 최종 정규 표현식 컨텍스트와 매우 관련이 있습니다. 내가 언급 한 것처럼 시도와 함께 정규 표현식 이스케이프를 찾는다는 것은 아마도 다른 컨텍스트에는 시도의 기억을 혼란스럽게하는 다른 문자 집합이 있기 때문일 수 있습니다 (백 슬래시는 해당 컨텍스트 대신 문자 대신 이스케이프 문자로 사용되는 문자입니다) ).


https://perldoc.perl.org/perlre.html#Quoting-metacharactershttps://perldoc.perl.org/functions/quotemeta.html

공식 문서에서 이러한 문자를 메타 문자라고합니다. 인용의 예 :

my $regex = quotemeta($string)
s/$regex/something/

Ionic (Typescript)의 경우, 문자를 이스케이프하려면 슬래시를 두 번 사용해야합니다. 예를 들어 (이것은 일부 특수 문자와 일치합니다)

"^(?=.*[\\]\\[!¡\'=ªº\\-\\_ç@#$%^&*(),;\\.?\":{}|<>\+\\/])"

] [ - _ . /캐릭터에 주의하십시오 . 이중 슬래시 여야합니다. 그렇게하지 않으면 코드에 유형 오류가 발생합니다.

참고 URL : https://stackoverflow.com/questions/399078/what-special-characters-must-be-escaped-in-regular-expressions



반응형