正则表达式-如果位于x.x.x的第二个位置,则仅包含0

时间:2019-06-18 01:09:26

标签: sql regex hadoop

我试图弄清楚如何为格式为xx.xx.xx的字符串编写正则表达式(但有时不包括第三个参数)

例如,字符串可以是:

12.1
12.1.0
14.5.1
8.2.1
8.2.0
8.2

我想要的是如果在第三位置包含尾随的0,或者如果缺少第三个参数,则将其填充为0。

所需的输出(从上方):

12.1
12.1
14.5.1
8.2.1
8.2
8.2

或者,如果更容易填充零,则所需的输出将是:

12.1.0
12.1.0
14.5.1
8.2.1
8.2.0
8.2.0

尝试(在SQL中):

SELECT regexp_extract('10.0.0', '^([^.]*.[^.]*.[^.]*[^0])', 0);
SELECT regexp_extract('10.0.0', '^([^.]*.[^.]*.[^.0]*', 0);
SELECT regexp_extract('10.0.0', "([0-9]+\.[0-9]+\.[1-9]+)");

例如,上面的大多数内容只是给我10.0.0而不是10.0。

3 个答案:

答案 0 :(得分:1)

尝试使用REGEXP_REPLACE

SELECT REGEXP_REPLACE('10.0', '^[0-9]+\.[0-9]+$', '\\0.0');

或者可以使用$0代替\\0作为完整捕获组:

SELECT REGEXP_REPLACE('10.0', '^[0-9]+\.[0-9]+$', '$0.0');

正则表达式^[0-9]+\.[0-9]+$仅针对具有两个(但不是三个)路径分量的术语。在这种情况下,它将附加结尾的.0

答案 1 :(得分:0)

填充零非常简单:

select (case when col not like '%.%.%'
             then concat(col, '.0')
             else col
        end)

答案 2 :(得分:0)

我认为您想要

SELECT regexp_extract('10.0.0', "([0-9]+\.[0-9]+(\.[1-9]+)?)");

在上面的表达式中,由于结尾是。[1-9] +,因此将完全不匹配。通过在此表达式周围添加括号,可以用“?”注释它。匹配一次是否存在。