2016-12-15 91 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

在任何情況下,你將不得不寫一個更詳細的模式。你不能在一個分支中混合貪婪和懶惰的修改器。 –