如何在Oracle SQL查询中提取字符串括号之间的内容
问题核心原因
你的正则匹配规则和实际字符串的括号类型不匹配。你写的正则\((.+)\)是用来提取**圆括号()包裹的内容,但示例中的目标内容是被方括号[]**包裹的,所以完全匹配不到结果。
正确实现方案
方括号在正则表达式中属于特殊元字符,需要加反斜杠转义才能匹配字符本身,推荐使用正则方案,适配内容长度不固定、多对括号等场景:
-- 写法1:非贪婪匹配,取第一对方括号内的内容 REGEXP_SUBSTR(mssg, '\[(.+?)\]', 1, 1, NULL, 1) AS "description" FROM book;
-- 写法2:排除法匹配,性能更稳定,不会出现贪婪匹配越界问题 REGEXP_SUBSTR(mssg, '\[([^\]]+)\]', 1, 1, NULL, 1) AS "description" FROM book;
substr写法修正
如果你坚持用substr+instr实现,需要修正括号类型和位置计算逻辑:
SUBSTR( mssg, INSTR(mssg, '[') + 1, INSTR(mssg, ']') - INSTR(mssg, '[') - 1 ) AS "description" FROM book;
该写法仅适用于字符串中仅存在一对方括号的场景,灵活性不如正则方案。
内容的提问来源于stack exchange,提问作者user16523359
相关产品推荐
相关产品推荐

