就個人而言,我會使用一個Perl兼容的正則表達式的現代化,而不是可怕的POSIX式的正則表達式:
regress=> SELECT (regexp_matches('<pika> [SOME_TEXT_WITH|ACTION] And other stuff...', '\[(.*?)\]'))[1];
regexp_matches
-----------------------
SOME_TEXT_WITH|ACTION
(1 row)
如果你想使用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_\|]+#"\] %' FOR '#'
正在變成類似:
'.*> \\[([A-Z_\\|]+)\\] .*'
導致:
regress=> SELECT (regexp_matches('<pika> [SOME_TEXT_WITH|ACTION] And other stuff...', '.*> \\[([A-Z_\\|]+)\\] .*'))[1];
ERROR: invalid regular expression: parentheses() not balanced
'regexp_matches'不返回數組嗎? – greg
@greg是的,這就是爲什麼我寫了'(regexp_matches(...))[1]' –
Yuuu ...我不知道我們可以做到這一點......太棒了! Thx – greg