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 不起作用

regexp_substr 提取字符串中的度量单位

REGEXP_SUBSTR 红移

oracleoracle REGEXP_SUBSTR分割字符串

Oracle 字符串转多行(REGEXP_SUBSTR)