REGEXP_SUBSTR - 如何 "avoid" 括号中的字符串

REGEXP_SUBSTR - how to "avoid" bracket in string

我在数据库 Blanket By-Laws Coverage (Building Only) - Form:G00150 中有以下字符串,我需要 return 只有“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 可以工作,但事实并非如此,我找不到让它工作的方法

有人能帮忙吗?

谢谢, 迈克尔

REGEXP_SUBSTR 与仅围绕表单值的捕获组一起使用:

SELECT MAX(REGEXP_SUBSTR(pqb.description, 'Blanket By-Laws Coverage \(Building Only\) - Form:(\S*)', 1, 1, 'i', 1)) 
FROM tablename;

请注意,(Building Only) 周围的括号是 字面意思 ,因此,应使用反斜杠对它们进行转义。另请注意,在您当前的查询中,除了表单和值之外,您还有另一个捕获组。您也不需要那个捕获组,所以我已将其删除。

你需要对括号进行转义,还需要第一个子表达式。所以使用以下 regexp

SELECT  MAX(REGEXP_SUBSTR(pqb.description,
                         'Blanket By-Laws Coverage \(Building Only\) - Form:(.*)',
                          1,1,'i',1) )    columnname 
FROM    tablename [...]

db<>fiddle

为什么要担心转义 parens?难道你不想要“Form:”之后的内容吗?请注意,如果未找到匹配项,REGEXP_REPLACE 将 return 原始字符串,其中 REGEXP_SUBSTR 将 return 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:(.*)', '') AS Form
from pqb;


FORM  
------
G00150
1 row selected.