我试图弄清楚如何为格式为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。
答案 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] +,因此将完全不匹配。通过在此表达式周围添加括号,可以用“?”注释它。匹配一次是否存在。