【问题标题】:Capture the last group/word捕获最后一组/单词
【发布时间】:2021-12-04 17:47:19
【问题描述】:

我想从匹配的正则表达式中捕获最后一个单词。这是我的查询。

SELECT REGEXP_SUBSTR(
'The;quick;brown;fox;jumps;over;the;lazy;dog','^([^;]*;){5}([^;]*)') REF
FROM
DUAL

Desired result: over
Actual Result: The;quick;brown;fox;jumps;over

我可以做子正则表达式,但如果有数百万条记录,它会影响性能……

嵌套正则表达式

SELECT REGEXP_SUBSTR(REGEXP_SUBSTR(
'The;quick;brown;fox;jumps;over;the;lazy;dog',
'^([^;]*;){5}([^;]*)'),'[^;]*$') REF
FROM
DUAL

【问题讨论】:

  • @JvdV Oracle 不支持非捕获(?:) 组。您需要删除 ?: 并获取第二个捕获组。
  • 是的,我正在阅读您的答案。我猜你已经涵盖了它=)

标签: regex oracle


【解决方案1】:

如果您想使用REGEXP_SUBSTR,请使用它的第四个参数作为您要查找的事件:

SELECT REGEXP_SUBSTR(
         'The;quick;brown;fox;jumps;over;the;lazy;dog',
         '[^;]+',
         1,
         6) AS ref
FROM dual;

文档:https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/REGEXP_SUBSTR.html#GUID-2903904D-455F-4839-A8B2-1731EF4BD099

【讨论】:

  • 嗨@Thorsten Kettner,你的也可以。谢谢。
【解决方案2】:

如果您担心性能(因为它们很慢),请不要使用正则表达式,只需使用普通字符串函数即可:

SELECT SUBSTR(
         value,
         INSTR(value, ';', 1, 5) + 1,
         INSTR(value, ';', 1, 6) - INSTR(value, ';', 1, 5) - 1
       ) AS DATA
FROM   table_name;

如果您确实想使用正则表达式,那么只需提取捕获组的值:

SELECT REGEXP_SUBSTR(value, '(.*?);', 1, 6, NULL, 1) AS data
--                                    ^ Start from
--                                       ^ Occurrence
--                                                ^ Capturing group to extract
FROM   table_name;

其中,对于样本数据:

CREATE TABLE table_name ( value ) AS
SELECT 'The;quick;brown;fox;jumps;over;the;lazy;dog' FROM DUAL;

两个输出:

DATA
over

db小提琴here

【讨论】:

  • 嗨@MT0,谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
  • 2020-12-16
  • 2013-09-07
相关资源
最近更新 更多