2013-12-11 2 views
2

이 정규식 예제를 구문 분석하려고합니다.이 정규식에서 \ +의 의미는 무엇입니까?

슬래시를 이스케이프 문자로 사용할 수 있다는 것을 알고 있습니다. 당신은 의미없이)를 검색하기를 원한다면 그래서

가 나는 또한 더하기 기호가 하나 이상을 나타낼 수 있다는 사실을 알고 ... 당신이 \ 할 것 다음 )맞춤법이 밖으로 스택 오버플로 정규식을 방지하기 위해 그룹화 선행 항목.

아래의 예에서 더하기 기호 또는 슬래시가 이스케이프됩니까? 첫 번째 슬래시를 사용하면 두 번째 슬래시를 "이스케이프"하고 더하기 기호는 적어도 하나의 이전 슬래시가 있음을 나타냅니다. 그러나 예에서는 문자열에 적어도 두 개 이상이 있음을 나타냅니다.

이 정규식은 무엇을 의미합니까? 그것을 분석하기에는 너무 많은 새로운 일들이 계속되고 있습니다.

enter image description here

+1

정규식처럼 보이는 [tag : postgresql] 태그를 추가했습니다. 태그가 틀린 경우 변경할 수 있습니다. – cmbuckley

+0

여기에는 'standard_conforming_strings' 매개 변수의 값과 마찬가지로 PostgreSQL 버전이 중요합니다. 그것은 두 개 이상의 \ s ('standard_conforming_strings = on') 또는'++'('standard_conforming_strings = off')로 시작하는 것을 찾기 위해 기이하게 표현 된 정규 표현식 일 수 있습니다. –

답변

8

그러나 아래의 예 는 더하기 기호 또는 슬래시 이스케이프지고?

둘 다!

\은 사용중인 쿼리 언어가 이스케이프 문자로 사용하기 때문에 (즉, 따옴표를 이스케이프 처리하기 위해) 이스케이프 처리됩니다. 따라서 \\은 을 이스케이프하는 데 사용되는 정규식에서 \으로 이해됩니다. 정규식은 단일 + 다음에 0 또는 다수 +이 오는 것을 의미합니다.

두 번째 +이 실제로 정규식 한정 기호 인 \\++으로 다시 작성 될 수 있습니다.

+0

문서 (postgres로 가정) : http://www.postgresql.org/docs/8.1/static/functions-matching.html#POSIX-ESCAPE-SEQUENCES – cmbuckley

+0

아, 거기에 SQL의 맛을 인식하지 못했습니다. – Vache

+0

@cbuckley 바쉬가 '이스케이프 따옴표'로 말한 것 – bernie2436

2

그 regexp는 PostgreSQL 버전과 standard_conforming_strings 값에 따라 실제로 두 가지를 의미 할 수 있습니다.

이전 버전 (standard_conforming_strings 이전 또는 기본값이 off 인 문자열)은 문자열을 백 슬래시 이스케이프 문자열로 해석합니다. 따라서 PostgreSQL은 \\+\\+*\+\+*으로 변환합니다. 즉, 이스케이프 수준을 사용합니다. 그런 다음 정규 표현식은 나머지 레벨을 소모하여 플러스 문자를 이스케이프 처리하므로 정규화자가 아닌 리터럴 + s로 해석됩니다. 그 정규 표현식은 ++ 다음에 0 이상의 다른 문자이옵니다.

standard_conforming_strings이 기본값 인 최신 버전은 on으로 기본 설정되어 있으며 SQL 표준에 따라 백 슬래시를 이스케이프로 디코딩하지 않습니다. 따라서 \\+\\+*을 실행하면 하나 이상의 백 슬래시 뒤에 하나 이상의 백 슬래시가오고 그 뒤에 ... oops가 나오며 선행 문자가없는 별표는 오류입니다.

우리는 당신이 standard_conforming_strings을 가지고 있어야한다는 것을 알고 있습니다. '새로운 쿼리에서 정규 표현식을 컴파일하지 못해서.

나중에이 문제가 발생하므로 업그레이드하기 전에이 문제를 해결할 것을 권합니다.가 흑자로 시작하지 않으면

x_spam_level LIKE '++%' 

사용 : 다음 x_spam_level 필드는 항상 정규 표현식은 확인하지 않습니다 흑자로 시작한다고 가정

, 그 코드는 더 나은로 기록 될 수 있습니다

x_spam_level LIKE '%++%' 

현재 정규 표현식이 수행하는 작업입니다. PostgreSQL은이를 내부적으로 정규 표현식으로 변환 할 것이지만, 여러분은 탈출에 대해 걱정할 필요가 없습니다.

정규 표현식을 사용하고자하고 모든 버전에서 consisently 행동이있는 경우

는 사용

x_spam_level ~ E'\\+\\+*' 

E'' 구문에 관계없이 standard_conforming_strings 설정, 탈출 백 슬래시를 디코딩 PostgreSQL을 알려줍니다.

관련 문제