如何通过 Oracle regexp_replace 中的正则表达式从逗号分隔列表中删除重复项? [复制]

Posted

技术标签:

【中文标题】如何通过 Oracle regexp_replace 中的正则表达式从逗号分隔列表中删除重复项? [复制]【英文标题】:How to remove duplicates from comma separated list by regex in Oracle regexp_replace? [duplicate] 【发布时间】:2014-12-27 15:09:40 【问题描述】:

我有

'VA - HRD 1, VA - HRD 1, VA - NOVA 1, VA - NOVA 1'

想要得到

'VA - HRD 1, VA - NOVA 1'

我在努力

regexp_replace( 'VA - HRD 1, VA - HRD 1, VA - NOVA 1, VA - NOVA 1' ,'([^,]+)(,\1)+', '\1')

但它不会删除所有重复项,它会生成:VA - HRD 1, VA - HRD 1, VA - NOVA 1

请帮忙...

【问题讨论】:

假设重复项被组合在一起? 【参考方案1】:
([^,]+)(,[ ]*\1)+

试试这个。这很有效。查看演示。

http://regex101.com/r/yG7zB9/8

问题是VA - HRD 1, VA - HRD 1

                     ^  ^

此处的空格。您没有考虑到这一点,因为第一个匹配项后面没有空格。因此请输入[ ]*\s* 以使其接受。

【讨论】:

谢谢,伙计!真的很有效 @goodspeed 不客气。 老兄,如果字符串中没有空格,如:National,Carrier,Retail,Internal,National 怎么办? @goodspeed we have used [ ]* * 是为0 t more.所以它应该可以正常工作 我真的不知道为什么这个正则表达式总是被转发,这是错误的,因为它也匹配 '3773,3774,3830,3830' 中的 '3,3'【参考方案2】:
Select replace(REGEXP_REPLACE('1234567890,2220006789,2220006789,477-000-6789','([^,]+)(,[ ]*\1)+'),',,',',') 
As [columnName] From [tableName]

【讨论】:

如果这个答案包含一些关于代码在做什么的解释,将会得到很大的改进。虽然“仅代码”可能是正确的,但不一定能帮助请求者理解。 这并没有回答他想要制作一个不同的列表而不是实际删除重复项的问题..例如 A, A, B, B -> A,B correct , A, B , B, C - > A、C 错误答案。 这可能对其他东西有用,但它不能回答问题。

以上是关于如何通过 Oracle regexp_replace 中的正则表达式从逗号分隔列表中删除重复项? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Oracle regexp_replace 中的正则表达式从逗号分隔列表中删除重复项? [复制]

如何在 Oracle 中使用 REGEXP_REPLACE 删除单词

试图了解oracle REGEXP_REPLACE如何工作

如何在 edb 中使用相同的 REGEXP_REPLACE(Oracle sql)

oracle 使用 REGEXP_REPLACE 函数替换子字符

Regexp_replace :从 Oracle 中的“+”分隔字符串中删除重复项 [重复]