2013-06-05 2 views
0

<pika> [SOME_TEXT_WITH|ACTION] And other stuff...과 같은 문자열을 가진 message 필드가 있습니다.Postgresql의 부분 문자열 표현

대괄호 안의 내용을 캡처하고 싶습니다. 나는 다음과 같은 형태로 사용

SELECT 
    substring(message FROM '%> \[#"[A-Z_\|]+#"\] %' FOR '#') AS my_info 
FROM my_table; 

를하지만 항상 같은 ennoying 오류 메시지와 함께 실패 :«잘못된 정규 표현식 : 괄호()를하지 균형». 내가 뭘 잘못 했니? 당신이 POSIX 구문을 사용하고자하는 경우, 지속적으로 같은 탈출을 사용하지 않을해야

regress=> SELECT (regexp_matches('<pika> [SOME_TEXT_WITH|ACTION] And other stuff...', '\[(.*?)\]'))[1]; 
    regexp_matches  
----------------------- 
SOME_TEXT_WITH|ACTION 
(1 row) 

:

답변

2

개인적으로, 나는 대신 무시 무시한 POSIX - 억양으로 정규 표현식의 펄 호환 현대 정규 표현식을 사용하십시오 어떤 곳에서는 \이고 다른 곳에서는 #입니다. 예 :

regress=> SELECT substring(
      '<pika> [SOME_TEXT_WITH|ACTION] And other stuff...' 
      FROM '%#"#[%#]#"%' FOR '#' 
     ); 
     substring   
------------------------- 
[SOME_TEXT_WITH|ACTION] 
(1 row) 

워드 프로세서 캡처 운영자가 특별히 실제로 <ESCAPECHAR>"하지 #" 것을 매우 명확하지 않습니다. 이것은 일반 백 슬래시 이스케이프를 사용하여 동일하게 유효합니다

regress=> SELECT substring(
       '<pika> [SOME_TEXT_WITH|ACTION] And other stuff...' 
       FROM '%\"\[%\]\"%' FOR '\' 
     ); 
     substring   
------------------------- 
[SOME_TEXT_WITH|ACTION] 
(1 row) 

이상한 오류의 원인은 PostgreSQL의이 내부적으로 진짜 정규 표현식으로 POSIX SIMILAR TO 스타일의 표현을 번역한다는 것입니다. 귀하의 혼합 탈출 정규식 : 결과

'.*> \\[([A-Z_\\|]+)\\] .*' 

:

'%> \[#"[A-Z_\|]+#"\] %' FOR '#' 

같은 것을로 전환되고

regress=> SELECT (regexp_matches('<pika> [SOME_TEXT_WITH|ACTION] And other stuff...', '.*> \\[([A-Z_\\|]+)\\] .*'))[1]; 
ERROR: invalid regular expression: parentheses() not balanced 
+0

'regexp_matches'가 배열을 반환하지 않습니까? – greg

+0

@greg 예, 그렇기 때문에'(regexp_matches (...)) [1]' –

+0

Yuuu ... 나는 우리가 그 일을 할 수 있는지 몰랐습니다 ... 굉장합니다! Thx – greg

1

나는 다음 당신이 원하는 것을 생각 :

SELECT substring(cast(message as varchar(1000)) FROM '.*\[([A-Z_\|]*)\].*' 
       ) 
FROM my_table; 
+0

당신의 솔루션도 효과적입니다. CAST가 정규 표현식을 작동시키는 이유를 잘 모르겠습니다. '하위 프레임 (CAST (메시지 AS varchar) FROM'<# "[0-9a-zA-Z, :] + #"> % 'FOR'# ') AS my_info'가 작동합니다. 편집 : 나는 잘못된 라인으로 테스트했습니다. Craig는 도망 치는 소리에 대해 옳습니다. – greg

+0

@ 집합 . . SQLFiddle에서 이것을 테스트 할 때 필자가 필요했습니다. –