정규식으로 백 슬래시를 벗어날 수 없습니까?


114

다음 정규식을 사용하고 있습니다.

^[a-zA-Z0-9\',!;\?\$\^:\\\/`\|~&\" @#%\*\{}\(\)_\+\.\s=-]{1,1000}$

나는 그것이 추악하다는 것을 알고 있지만 지금까지 그것이 탈출했기 때문에 내가 생각하는 것처럼 백 슬래시가 허용되지 않는 것 이외의 목적에 부합 하지만 동일한 결과 \\대신 시도 했습니다 \\\. 어떤 아이디어?


4
방금 제목의 오타를 수정했지만 "정규식으로 반발을 피할 수 없습니까?"라는 제목에 대해 매우 멋진 점이 있습니다. 과연!
Adam Crossland

1
@AdamCrossland 우리 모두 정규식이 반발을 피하는 데 도움이 될 수 있기를 바라지 않습니까? > _>
Eton B.

2
도대체 정규식에서 반발을 피할 수 있기를 바랍니다.
Adam Crossland

답변:


226

당신은 프로그램 내에서 문자열이 퍼팅하는 경우, 당신은 실제로 그것을 "드 탈출"할 때 문자열 파서 그 두 가지를 제거하기 때문에 (네 개의 백 슬래시를 사용해야 할 수도 문자열 , 다음 정규식은 두 가지가 필요합니다 이스케이프 정규식 백 슬래시).

예를 들면 :

regex("\\\\")

다음과 같이 해석됩니다.

regex("\\" [escaped backslash] followed by "\\" [escaped backslash])

다음과 같이 해석됩니다.

regex(\\)

단일 백 슬래시와 일치하는 정규식으로 해석됩니다.


언어에 따라 이스케이프 시퀀스를 구문 분석하지 않는 다른 형식의 따옴표를 사용할 수 있습니다. 예를 들어 Python에서 :

re.compile(r'\\')

r따옴표의 전면은 그것을 만드는 원료 되지 해석 백 슬래시 이스케이프를하지 문자열입니다.


14
헤헤 ... 방금이 문제를 만났고 3 개를 더해야했습니다. 작동 할 때까지 백 슬래시를 계속 추가했습니다.
billynoah 2015-04-27

음, 도대체 왜이 정규식이 PCRE를위한 것처럼 한 번이 아니라 두 번 재 해석되는 걸까요?
짐 마이클스

3
모든 언어가 정규식 리터럴을 이스케이프 처리하지 않은 것은 아니기 때문에 @JimMichaels는 때때로 프로그래밍 언어 자체가 문자열 구문에서 슬래시 이스케이프를 한 번 해석하고 결과 문자열이 정규식 엔진에 전달됩니다 (정규식 구문에서 슬래시 이스케이프를 해석 함).
Amber

1
오래 전에, 식별 기능이 Windows 파일 경로 인 요소의 xpath를 캡처 한 다음 xpath가 문자열로 표시되는 프로그램 (문자열)을 생성해야했습니다. 중간 단계의 한 지점에서 파일 경로의 단일 백 슬래시를 나타내는 데 8 개의 백 슬래시가 사용되었습니다. 그것은 내가 얻은 최고입니다.
Zackkenyon

이는 메타 문자가 필요한 패턴과 함께 백 슬래시를 검색 할 때 더욱 복잡해질 수 있습니다. 예를 들어 백 슬래시 뒤에 숫자를 찾습니다. 이제 무슨 일이 일어나고 있는지 파악하기 위해 다음 표현을 응시할 것입니다 new RegExp('\\\\\\d');..
jabacchetta

15

리터럴이 아니라면 이스케이프 된 백 슬래시를 의미 \\\\하도록 을 사용해야 \\합니다.

두 가지 표현이 있기 때문입니다. 정규식의 문자열 표현 "\\\\"에는 파서로 전송되는,이 있습니다. 파서는 \\유효한 이스케이프 백 슬래시 (단일 백 슬래시와 일치)로 해석되는 것을 확인합니다.


10

백 슬래시 \는 정규식의 이스케이프 문자입니다. 따라서 이중 백 슬래시는 실제로 단일 문자 백 슬래시를 의미합니다.

\ (backslash) followed by any of [\^$.|?*+(){} escapes the special character to suppress its special meaning.

심판 : http://www.regular-expressions.info/reference.html


4

에서 http://www.regular-expressions.info/charclass.html :

문자 클래스 내의 유일한 특수 문자 또는 메타 문자는 닫는 대괄호 (]), 백 슬래시 (\\), 캐럿 (^) 및 하이픈 (-)입니다. 일반적인 메타 문자는 문자 클래스 내의 일반 문자이며 백 슬래시로 이스케이프 할 필요가 없습니다. 별표 또는 더하기를 검색하려면 [+ *]를 사용하세요. 문자 클래스 내에서 일반 메타 문자를 이스케이프하면 정규식이 제대로 작동하지만 가독성이 크게 떨어집니다.

문자 클래스 내에 특별한 의미가없는 문자로 백 슬래시를 포함하려면 다른 백 슬래시로 이스케이프해야합니다. [\\ x]는 백 슬래시 또는 x와 일치합니다. 닫는 대괄호 (]), 캐럿 (^) 및 하이픈 (-)은 백 슬래시로 이스케이프하거나 특수한 의미를 갖지 않는 위치에 배치하여 포함 할 수 있습니다. 가독성을 높이기 때문에 후자의 방법을 권장합니다. 캐럿을 포함하려면 여는 괄호 바로 뒤를 제외하고 아무 곳에 나 배치하십시오. [x ^]는 x 또는 캐럿과 일치합니다. 여는 대괄호 또는 부정 캐럿 바로 뒤에 닫는 대괄호를 놓을 수 있습니다. [] x]는 닫는 대괄호 또는 x와 일치합니다. [^] x]는 닫는 대괄호 나 x가 아닌 모든 문자와 일치합니다. 하이픈은 여는 대괄호 바로 뒤, 닫는 대괄호 바로 앞 또는 부정 캐럿 바로 뒤에 포함될 수 있습니다.

정규식을 작성하는 언어는 무엇입니까?


0

이 솔루션은 br 태그를 '\ n'으로 바꾸는 동안 내 문제를 해결했습니다.

alert(content.replace(/<br\/\>/g,'\n'));
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.