REGEXP_REPLACE函数输出中的解释

时间:2019-04-09 15:07:21

标签: sql regex oracle

以下两个查询给出了一些输出,

 Select REGEXP_REPLACE('Milind,Milind,Gopal,Gopal,Gopal,Milind'), '([^,]+) (,\1)+(,|$)', '\1\3') "OUTPUT"
FROM dual;

o/p Milind,Gopal,Milind


Select REGEXP_REPLACE('Milind,Milind,Gopal,Gopal,Gopal,Milind'), '([^,]+) (,\1+)(,|$)', '\1\3') "OUTPUT"
FROM dual;

o/p Milind,Gopal,Gopal,Milind

我不了解工作流程。它如何提供输出。 谁能帮我解释一下。

1 个答案:

答案 0 :(得分:1)

[^,]匹配一个字符,该字符可以是逗号以外的任何字符。例如:M

[^,]+匹配除逗号以外的任何字符1次或多次。例如:Milind

([^,]+)相同,但是捕获了结果,因此以后可以使用\1进行引用。

(,\1)+与一个逗号匹配,并与前一个捕获匹配一次或多次,然后将结果捕获为\2。如果\1Milind,则可以匹配:,Milind,Milind,Milind,Milind,Milind,Milind,等等。

(,|$)匹配逗号或行尾,并将其捕获为\3

\1\3是替换模式:我们仅保留\1\3,因此捕获\2中匹配的所有内容均被有效删除。

第二条语句显示了一个小差异,该错误引入了一个错误:

(,\1+)匹配逗号,然后是前一个捕获的一个或多个出现,如,Milind,MilindMilind,MilindMilindMilind中所示。结果,它无法删除多个逗号分隔的事件。