Search code examples
hivehqlregexp-replace

Replacing first occurence of character in a string using HiveQL


I am trying to replace the first occurrence of '-' in a string in Hive table. I am using HiveQL. I searched this topic here and other websites, but could not find clear explanation how to use metacharacters with regexp_replace() to do that.

This is a string from which I need to replace first '-' with empty space: 16-001-02707 The result should be like this: 16001-02707 This is the method I used:

select regexp_replace ('16-001-02707','[^[:digit:]]', '');

However, this doesn't do anything.


Solution

  • select regexp_replace ('16-001-02707','^(.*?)-', '$1');
    

    16001-02707


    Following the OP question in the comments

    with t as (select '111-22-333333-4-555-6-7-8888-999999' as col)
    
    select  regexp_replace (col,'^(.*?)-','$1')
           ,regexp_replace (col,'^(.*?-.*?)-','$1')
           ,regexp_replace (col,'^((.*?-){2}.*?)-','$1')
           ,regexp_replace (col,'^((.*?-){3}.*?)-','$1')
           ,regexp_replace (col,'^((.*?-){4}.*?)-','$1')
           ,regexp_replace (col,'^((.*?-){5}.*?)-','$1')
    
    from    t
    

    +------------------------------------+------------------------------------+------------------------------------+------------------------------------+------------------------------------+------------------------------------+
    |                _c0                 |                _c1                 |                _c2                 |                _c3                 |                _c4                 |                _c5                 |
    +------------------------------------+------------------------------------+------------------------------------+------------------------------------+------------------------------------+------------------------------------+
    | 11122-333333-4-555-6-7-8888-999999 | 111-22333333-4-555-6-7-8888-999999 | 111-22-3333334-555-6-7-8888-999999 | 111-22-333333-4555-6-7-8888-999999 | 111-22-333333-4-5556-7-8888-999999 | 111-22-333333-4-555-67-8888-999999 |
    +------------------------------------+------------------------------------+------------------------------------+------------------------------------+------------------------------------+------------------------------------+