代码之家  ›  专栏  ›  技术社区  ›  Andrey Deineko

从regexp\u匹配结果中获取第二个匹配

  •  0
  • Andrey Deineko  · 技术社区  · 6 年前

    name 如下所示的列:

    '1234567 - 7654321 - some - more - text'
    

    我需要一根绳子 "7654321" . 我陷入了以下困境:

    SELECT regexp_matches('1234567 - 7654321 - some - more - text', '\d+', 'g');
    
    regexp_matches
    ----------------
    {1234567}
    {7654321}
    
    (2 rows)
    

    我怎样才能得到我想要的?也许还有比这更好的选择 regexp_matches

    2 回复  |  直到 6 年前
        1
  •  1
  •   Nick SamSmith1986    6 年前

    你可以用 REGEXP_REPLACE

    SELECT REGEXP_REPLACE('1234567 - 7654321 - some - more - text', '^\d+[^\d]+(\d+).*$', '\1');
    

    7654321
    

    此regexp查找以某个数字开头的字符串( ^\d+ [^\d]+ )然后是另一组数字( (\d+) .*$ ). 这个 () \1 . 自 只替换字符串中与正则表达式匹配的部分,必须有一个与正则表达式匹配的正则表达式 字符串,以便将其替换为所需的数据。

    更新

    ^[^\d]*\d+[^\d]+(\d+).*$
    

    如果有可能只有一组数字在开头,我们必须使匹配的第一部分可选。我们可以使用非捕获组:

    ^[^\d]*(?:\d+[^\d]+)?(\d+).*$
    

    这使得第一组数字的匹配是可选的,因此如果它不存在(即只有一组数字),regex仍将匹配。通过使用非捕获组(添加 ?: 对于组的开头,我们不需要将替换字符串从 . 更新 SQLFiddle

        2
  •  1
  •   a_horse_with_no_name    6 年前

    regexp_matches() with ordinality 选项:

    SELECT t.value
    from regexp_matches('1234567 - 7654321 - some - more - text', '\d+', 'g') with ordinality as t(value,idx)
    where t.idx = 2;
    

    请注意 value

    SELECT t.value[1]
    from regexp_matches('1234567 - 7654321 - some - more - text', '\d+', 'g') with ordinality as t(value,idx)
    where t.idx = 2;