使用postgres regexp捕获一个点

时间:2016-12-15 16:54:37

标签: regex postgresql

我有这些字符串:

3           FD160497.   2016  abcd
3           FD160497   2016  abcd

我想捕获“FD”,数字,然后是点,如果它存在。

我试过了:

SELECT
    sqn[1] AS letters,
    sqn[2] AS digits,
    sqn[3] AS dot
FROM (
    SELECT
        regexp_matches(string, '.*?(FD)([0-9]{6})(\.)?.*') as sqn
    FROM
        mytable
) t;

(PostgreSQL 9.5.3)

在这两种情况下,

“点”列都是NULL,我真的不知道为什么。 它适用于regex101

1 个答案:

答案 0 :(得分:1)

第一个懒惰模式使当前分支中的所有量词变得懒惰,因此您的模式等同于

.*?(FD)([0-9]{6})(\.)??.*?
                     ^^  ^

查看其demo at regex101.com

请参阅9.7.3.1. Regular Expression Details excerpt

  

...匹配是以这样一种方式完成的,即分支或整个RE与整个最长或最短的子串匹配。一旦确定了整个匹配的长度,就根据该子表达式的贪婪属性确定匹配任何特定子表达式的部分,在RE中较早开始的子表达式优先于稍后开始的子表达式。

您需要在一个分支中始终使用量词:

regexp_matches(string, '.*(FD)([0-9]{6})(\.)?.*') as sqn

regexp_matches(string, '.*[[:blank:]](FD)([0-9]{6})(\.)?.*') as sqn

请参阅regex demo