【问题标题】:Replacing multiple occurrence by single occurrence in string用字符串中的单个出现替换多个出现
【发布时间】:2017-07-01 04:44:35
【问题描述】:

我有像“11223311”这样的数据,我希望所有多次出现都被单个出现替换,即上面应该变成“123”。我在 SAP HANA 工作。

但是通过使用以下逻辑,我得到了 '1231' 来自 '11223311'。

SELECT  REPLACE_REGEXPR('(.)\1+' IN '11223331' WITH '\1' OCCURRENCE ALL)  FROM DUMMY;

【问题讨论】:

    标签: sql regex sap hana


    【解决方案1】:

    请试试这个

    SELECT  REPLACE_REGEXPR(concat(concat('[^','11223331'),']') IN '0123456789' WITH '' OCCURRENCE ALL)  
    FROM    DUMMY;
    

    【讨论】:

    • concat() 只需要两个参数;这个给出了“SAP DBTech JDBC:[316]:函数调用中的参数数量错误”。为什么不直接写'[^11223331]'
    • @Hannobo - 真正的用例显然不是硬编码的值 11223331。代码已修复。谢谢
    【解决方案2】:

    您的正则表达式只替换多个连续出现的字符;这就是 \1+ 在匹配 (.) 之后直接做的事情。

    您可以使用前瞻来删除该匹配后某处也出现的所有字符。请注意,这会保留 最后一次,而不是第一次:

    SELECT  REPLACE_REGEXPR('(.)(?=.*\1)' IN '11223331' WITH '' OCCURRENCE ALL)  FROM DUMMY
    

    返回:231

    如果您想保留 first 的出现,我看不出仅使用一个正则表达式的可能性(不过我可能是错的)。以相同的方式使用后视是行不通的,因为它需要是可变长度的,这在 HANA 和大多数其他实现中不受支持。通常建议将 \K 作为替代,但 (.).*\K\1 之类的内容不适用于全部替换,因为 \K 之前的所有字符仍会在替换中使用。如果您可以在循环中运行相同的正则表达式,它可以工作,但为什么不首先使用非正则表达式循环(如用户定义的 HANA 函数)。

    【讨论】:

    • 我喜欢这个解决方案
    • @hannobo 真的很好用,非常感谢 :) 你能告诉我"(.)(?=.*\1)" 是怎么工作的吗??
    • @SarthakSrivastava:以文本形式写成“匹配一个字符(.),后面跟着任意数量的任意字符.*,再后面跟第一个字符\1。” (?= ) 是一个前瞻,确保满足条件但不消耗匹配的字符,因此替换可以逐个字符进行。
    猜你喜欢
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 2021-10-31
    • 1970-01-01
    • 2018-06-14
    相关资源
    最近更新 更多