您应该在谷歌上搜索更多关于 oracle regexp 的信息。
请试试这个。(Oracle 11g 以上)
SELECT REGEXP_SUBSTR(mssg, '\[[^0-9]*(\d+)[^0-9]*\]', 1, 1, NULL, 1) description
FROM book;
**This在这里帮我回答了。
更新:没关系。
SELECT REGEXP_SUBSTR('No information was found [{AI1234}].', '[[({][^0-9]*(\d+)[^0-9]*[]})]', 1, 1, NULL, 1) description
FROM dual;
更新:最终解决方案
SELECT REGEXP_SUBSTR('No information was found [{AI1234}].', '[[({]+([^][)(}{]*)[])}]+', 1, 1, NULL, 1) description
FROM dual;
在这里,您应该注意[^][)(}{]。
不要交换括号字符。
我会引用Oracle 11g Regexp reference
[ ]
用于指定匹配列表的括号表达式,该列表应匹配列表中表示的任何一个表达式。不匹配的列表表达式以抑扬符 (^) 开头,并指定与列表中表示的表达式以外的任何字符匹配的列表。
要在方括号表达式中指定右方括号 (]),请将其放在列表的第一个位置(如果有的话,在初始的抑扬符 (^) 之后)。
要在括号表达式中指定连字符,请将其放在列表的第一个位置(在初始的抑扬符 (^) 之后,如果有的话)、最后一个或作为范围表达式中的结束范围点。
这部分 - [^ ] - 很难破解,最后我从参考资料中找到了解决方案,这就是我强调这一点的原因。