【问题标题】:Regular expression - only include 0 if in 2nd position of x.x.x正则表达式 - 仅在 x.x.x 的第二个位置包含 0
【发布时间】:2019-06-18 01:09:26
【问题描述】:

我想弄清楚如何为 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。

【问题讨论】:

  • 只需要正则表达式吗?对于命令行上的此类任务,我将使用awk。不过,您似乎对使用 SQL 有一些特殊的需求?
  • 感谢大家迄今为止的帮助。是的,它需要是SQL。这将针对 Hadoop 中的一个非常大的数据集运行,因此计算速度是一个因素。

标签: sql regex hadoop


【解决方案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

【讨论】:

  • 谢谢!!选择这个是因为它满足了我的需要,并且似乎在我的 Hadoop 环境中运行速度最快。
【解决方案2】:

用零填充很容易:

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

【讨论】:

    【解决方案3】:

    我想你想要:

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

    在您上面的表达式中,由于结尾部分 .[1-9]+,它将无法完全匹配。通过在此表达式周围添加括号,您可以使用“?”对其进行注释。如果它存在一次或不存在,则匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      相关资源
      最近更新 更多