gpt4 book ai didi

sql - Postgresql的子串表达式

转载 作者:行者123 更新时间:2023-11-29 12:46:43 29 4
gpt4 key购买 nike

我有一个字段 message<pika> [SOME_TEXT_WITH|ACTION] And other stuff... 这样的字符串.

我想捕捉括号内的内容。我使用以下形式:

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

但它总是会失败并显示相同的令人讨厌的错误消息:«无效的正则表达式:括号 () 不平衡»。我做错了什么?

最佳答案

就个人而言,我会使用与 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

关于sql - Postgresql的子串表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16941239/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com