我有像“11223311”这样的数据,我希望所有多次出现都被单次出现所取代,即上面应该变成'123'。我在SAP HANA工作。
但是通过使用以下逻辑,我得到了 '1231'来自'11223311'。
SELECT REPLACE_REGEXPR('(.)\1+' IN '11223331' WITH '\1' OCCURRENCE ALL) FROM DUMMY;
答案 0 :(得分:3)
您的正则表达式仅替换多个连续出现的字符;这是匹配\1+
之后的(.)
正在做的事情。
您可以使用预测来删除在该匹配后也出现的所有字符。请注意,这会保留 last ,而不是第一个:
SELECT REPLACE_REGEXPR('(.)(?=.*\1)' IN '11223331' WITH '' OCCURRENCE ALL) FROM DUMMY
返回:231
如果你想保留第一个,我不会看到只有一个正则表达式的可能性(虽然我可能是错的)。以相同的方式使用后视不起作用,因为它需要是可变长度的,这在HANA和大多数其他实现中是不受支持的。经常推荐\ K作为替代方案,但(.).*\K\1
之类的东西不能替换所有,因为\ K之前的所有字符仍然在替换中消耗。如果您可以在循环中运行相同的正则表达式,它可以工作但是为什么不首先使用非正则表达式循环(如用户定义的HANA函数)。
答案 1 :(得分:0)
请试试这个
SELECT REPLACE_REGEXPR(concat(concat('[^','11223331'),']') IN '0123456789' WITH '' OCCURRENCE ALL)
FROM DUMMY;