Oracle 11g通过正则表达式获取所有匹配的匹配项

flo*_*ins 10 regex oracle

我正在使用Oracle 11g,我想使用REGEXP_SUBSTR来匹配给定模式的所有事件.例如

 SELECT
  REGEXP_SUBSTR('Txa233141b Ta233141 Ta233142 Ta233147 Ta233148',
  '(^|\s)[A-Za-z]{2}[0-9]{5,}(\s|$)') "REGEXP_SUBSTR"
  FROM DUAL;
Run Code Online (Sandbox Code Playgroud)

只返回第一个匹配Ta233141,但我想返回与正则表达式匹配的其他匹配项,即Ta233142 Ta233147 Ta233148.

Ale*_*ole 18

REGEXP_SUBSTR只返回一个值.您可以将字符串转换为伪表,然后查询匹配项.有一种基于XML的方法,目前让我无法逃脱,但使用connect-by工作,只要你只有一个源字符串:

SELECT REGEXP_SUBSTR(str, '[^ ]+', 1, LEVEL) AS substr
FROM (
    SELECT 'Txa233141b Ta233141 Ta233142 Ta233147 Ta233148' AS str FROM DUAL
)
CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(str, '[^ ]+')) + 1;
Run Code Online (Sandbox Code Playgroud)

... 给你:

SUBSTR             
--------------------
Txa233141b           
Ta233141             
Ta233142             
Ta233147            
Ta233148            
Run Code Online (Sandbox Code Playgroud)

...并且您可以使用原始模式的稍微简单的版本来过滤它:

SELECT substr
FROM (
    SELECT REGEXP_SUBSTR(str, '[^ ]+', 1, LEVEL) AS substr
    FROM (
        SELECT 'Txa233141b Ta233141 Ta233142 Ta233147 Ta233148' AS str
        FROM DUAL
    )
    CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(str, '[^ ]+')) + 1
)
WHERE REGEXP_LIKE(substr, '^[A-Za-z]{2}[0-9]{5,}$');

SUBSTR             
--------------------
Ta233141             
Ta233142             
Ta233147             
Ta233148             
Run Code Online (Sandbox Code Playgroud)

这不是很漂亮,但是在一个字段中都没有包含多个值.

  • 此代码不返回Ta233148.要获得更改CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(str,'[^] +'))到CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(str,'[^] +'))+ 1 (2认同)
  • 除了简单的分隔符之外,直接使用此代码将返回许多结果。用 REGEXP_COUNT(str, '[^ ]+') 替换 LENGTH(REGEXP_REPLACE(str, '[^ ]+'))+1 ,你会得到预期的结果。 (2认同)