【发布时间】:2017-07-01 04:44:35
【问题描述】:
我有像“11223311”这样的数据,我希望所有多次出现都被单个出现替换,即上面应该变成“123”。我在 SAP HANA 工作。
但是通过使用以下逻辑,我得到了 '1231' 来自 '11223311'。
SELECT REPLACE_REGEXPR('(.)\1+' IN '11223331' WITH '\1' OCCURRENCE ALL) FROM DUMMY;
【问题讨论】:
我有像“11223311”这样的数据,我希望所有多次出现都被单个出现替换,即上面应该变成“123”。我在 SAP HANA 工作。
但是通过使用以下逻辑,我得到了 '1231' 来自 '11223311'。
SELECT REPLACE_REGEXPR('(.)\1+' IN '11223331' WITH '\1' OCCURRENCE ALL) FROM DUMMY;
【问题讨论】:
请试试这个
SELECT REPLACE_REGEXPR(concat(concat('[^','11223331'),']') IN '0123456789' WITH '' OCCURRENCE ALL)
FROM DUMMY;
【讨论】:
'[^11223331]'?
您的正则表达式只替换多个连续出现的字符;这就是 \1+ 在匹配 (.) 之后直接做的事情。
您可以使用前瞻来删除该匹配后某处也出现的所有字符。请注意,这会保留 最后一次,而不是第一次:
SELECT REPLACE_REGEXPR('(.)(?=.*\1)' IN '11223331' WITH '' OCCURRENCE ALL) FROM DUMMY
返回:231
如果您想保留 first 的出现,我看不出仅使用一个正则表达式的可能性(不过我可能是错的)。以相同的方式使用后视是行不通的,因为它需要是可变长度的,这在 HANA 和大多数其他实现中不受支持。通常建议将 \K 作为替代,但 (.).*\K\1 之类的内容不适用于全部替换,因为 \K 之前的所有字符仍会在替换中使用。如果您可以在循环中运行相同的正则表达式,它可以工作,但为什么不首先使用非正则表达式循环(如用户定义的 HANA 函数)。
【讨论】:
(.),后面跟着任意数量的任意字符.*,再后面跟第一个字符\1。” (?= ) 是一个前瞻,确保满足条件但不消耗匹配的字符,因此替换可以逐个字符进行。