regex - POSIX ERE 正则表达式查找重复子字符串

标签 regex posix oracle-sqldeveloper regexp-substr posix-ere

我有一组字符串,其中最少包含 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/

相关文章:

regex - 正则表达式 : How to find dashes between words

java - 正则表达式在 String.matches() 中不起作用

java - 如何使用 Java 的正则表达式查找 (* comments *)?

c - `write(2)` 对本地文件系统的原子性

oracle-sqldeveloper - 如何更改 Oracle SQL Developer/Oracle Data Modeler 的时区?

javascript - 使用 Regex/jQuery 匹配 HTML 属性(用于搜索)

linux - 有没有一种简单的方法来 fork 文件描述符?

c - 非缓冲标准输入读取

mysql - 从名称首字母相同的表中选择

database - 如何在 liquibase 中将序列更改为 "NOCACHE"?