2016-12-15 94 views
1

点我有这些字符串:捕捉与Postgres的正则表达式

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上效果很好。

+0

尝试'regexp_matches(字符串,” *(FD)( [0-9] {6})(\。)?。*')as sqn'或甚至在'F'之前添加一个空格。 –

+0

尝试使用贪婪的旗帜。如果贪婪选项未设置(=懒惰),则该点可能会匹配最少的字符。该点将在最后与'。*'匹配。或者,您可以在最后一个问号后添加一个空格。 – Plasm

回答

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

+0

谢谢你,我认为我选择写''。*?(FD)...',因为我有其他的模式匹配... – Exrelev

+0

在任何情况下,你将不得不写一个更详细的模式。你不能在一个分支中混合贪婪和懒惰的修改器。 –