REGEXP_SUBSTR - 如何“避免”字符串中的括号
Posted
技术标签:
【中文标题】REGEXP_SUBSTR - 如何“避免”字符串中的括号【英文标题】:REGEXP_SUBSTR - how to "avoid" bracket in string 【发布时间】:2021-01-29 08:51:45 【问题描述】:我在 db Blanket By-Laws Coverage (Building Only) - Form:G00150
中有以下字符串,我只需要返回“G00150”值。
我正在使用这个 REGEXP_SUBSTR(pqb.description 在字符串上方)
SELECT MAX(REGEXP_SUBSTR(pqb.description,'(Blanket By-Laws Coverage (Building Only) - Form:)(.*)',1,1,'i',2)) columnname
FROM tablename [...]
我得到空值,我想这是因为字符串中的括号,但我不知道如何避免它。 在 99% 的情况下,描述没有括号,所以这个 REGEXP 有效,但事实并非如此,我找不到让它工作的方法
谁能帮忙?
谢谢, 米哈乌
【问题讨论】:
【参考方案1】:您需要转义括号,还需要第一个子表达式。所以使用下面的regexp
SELECT MAX(REGEXP_SUBSTR(pqb.description,
'Blanket By-Laws Coverage \(Building Only\) - Form:(.*)',
1,1,'i',1) ) columnname
FROM tablename [...]
db<>fiddle
【讨论】:
【参考方案2】:将REGEXP_SUBSTR
与仅围绕表单值的捕获组一起使用:
SELECT MAX(REGEXP_SUBSTR(pqb.description, 'Blanket By-Laws Coverage \(Building Only\) - Form:(\S*)', 1, 1, 'i', 1))
FROM tablename;
请注意,(Building Only)
周围的括号是文字,因此应该使用反斜杠对其进行转义。另请注意,在您当前的查询中,除了表单和值之外,您还有另一个捕获组。你也不需要那个捕获组,所以我把它删除了。
【讨论】:
【参考方案3】:为什么要担心转义括号呢?你不只是想要“Form:
”之后的内容吗?请注意,如果未找到匹配项,则 REGEXP_REPLACE 将返回原始字符串,其中 REGEXP_SUBSTR 将返回 NULL。
WITH pqb(description) AS (
SELECT 'Blanket By-Laws Coverage (Building Only) - Form:G00150' FROM dual
)
--SELECT REGEXP_SUBSTR(description, '.*Form:(.*)', 1, 1, NULL, 1) AS Form
SELECT REGEXP_REPLACE(description, '.*Form:(.*)', '\1') AS Form
from pqb;
FORM
------
G00150
1 row selected.
【讨论】:
以上是关于REGEXP_SUBSTR - 如何“避免”字符串中的括号的主要内容,如果未能解决你的问题,请参考以下文章
如何将 regexp_substr() 与一组分隔符一起使用?
当字符串之间有空白值时,REGEXP_SUBSTR 不起作用