我有一组字符串,其中最少包含 1 个值,最多包含 3 个值,格式如下:
123;456;789
123;123;456
123;123;123
123;456;456
123;456;123
我正在尝试编写一个正则表达式,以便可以找到同一字符串上重复的值,因此如果您有 123;456;789
,它将返回 null
但如果您有 123;456;456
,它将返回 456
,而 123;456;123
将返回 123
我设法写了这个表达式:
(.*?);?([0-9]+);?(.*?)\2
它的工作原理是,当没有重复值时,它返回 null
但它不完全返回我需要的值,例如:对于字符串 123;456;456
它返回 123;456;456
,对于字符串 123;123;123
它返回 123;123
我需要的是仅返回表达式的 ([0-9]+)
部分的值,根据我的阅读,这通常是使用非捕获组来完成的。但要么我做错了,要么 Oracle SQL 不支持这一点,就好像我尝试使用 ?:
语法,结果不是我所期望的。
关于如何在 oracle sql 上解决这个问题,有什么建议吗?该表达式的目的是在查询中使用它。
SELECT REGEXP_SUBSTR(column, "expression") FROM DUAL;
编辑:
实际上根据https://docs.oracle.com/cd/B12037_01/appdev.101/b10795/adfns_re.htm
Oracle Database implements regular expression support compliant with the POSIX Extended Regular Expression (ERE) specification.
根据 https://www.regular-expressions.info/refcapture.html
Non-capturing group is not supported by POSIX ERE
最佳答案
This answer描述如何从正则表达式中选择匹配组。所以使用它,
SELECT regexp_substr(column, '(\d{3}).*\1', 1, 1, NULL, 1) from dual;
# ^ Select group 1
Working demo正则表达式(由 OP 提供)。
关于regex - POSIX ERE 正则表达式查找重复子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46531249/