我有像“11223311”这样的数据,我希望所有多次出现都被单次出现替换,即上面的应该变成“123”。我在 SAP HANA 工作。
但是通过使用下面的逻辑我得到
来自“11223311”的“1231”。
SELECT REPLACE_REGEXPR('(.)\1+' IN '11223331' WITH '\1' OCCURRENCE ALL) FROM DUMMY;
最佳答案
您的正则表达式仅替换多个 连续 字符的出现;这就是\1+
直接匹配后 (.)
是在做。
您可以使用前瞻来删除在该匹配之后某处也出现的所有字符。请注意,这会保留最后一次出现,而不是第一次:
SELECT REPLACE_REGEXPR('(.)(?=.*\1)' IN '11223331' WITH '' OCCURRENCE ALL) FROM DUMMY
这将返回:
231
如果你想保留第一次出现,我看不到只有一个正则表达式的可能性(虽然我可能是错的)。以同样的方式使用后视是行不通的,因为它需要是可变长度的,这在 HANA 和大多数其他实现中不受支持。通常推荐使用\K 作为替代,但类似
(.).*\K\1
不适用于全部替换,因为\K 之前的所有字符仍会在替换中消耗。如果您可以在循环中运行相同的正则表达式,它可以工作,但为什么不首先使用非正则表达式循环(如用户定义的 HANA 函数)。
关于sql - 用字符串中的单个出现替换多次出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42199974/