2012-01-25 46 views
0

在postgresql中,我需要從給定列的字段中提取3個特定的字母數字字符,然後從中創建年份。所以如果字段的值是FUT,GRA,S12,1055559S11,1050830,PON,我需要S11S12,然後創建20112012。 結果可以保留爲文本字段。Postgres正則表達式regexp_split_to_array

我已經使用以下來獲得S??substring(my_field from E'(S\\d\\d),') 但創造一年似乎更具挑戰性。我希望能使用regexp_split_to_array,但它似乎沒有工作得很好。

回答

2

你看起來像你幾乎沒有 - 你只需要把 '20' 提取 '12'/ '11':

修訂(PostgreSQL有沒有邊界\b(?! )):

SELECT '20'||substring(my_field from E'(?:^|\\W)S(\\d\\d)(?!\\w)') .... 

-- NOTE: Old version. However there's no '\b' in this regex flavour. 
SELECT '20'||substring(my_field from E'\\bS(\\d\\d)\\b') .... 

你必須雙重逃避反斜槓。另外,在正則表達式中使用括號意味着所選的子字符串將是'12'或'11',不包括'S'。 '20'||xxxx只是連接兩個字符串。

(?:^|\\W)確保Sxx位於字符串的開始位置,或者位於非單詞字符(如空格或逗號)的前面。這可以防止匹配FUT,GRAS13,S12中的S13

(?!\\w)確保Sxx後面沒有跟着另一個單詞字符(即不是更大的單詞的一部分)。這可以防止S13S132,GRA,S12中匹配。

(注意 - 我以前有\b這意味着「單詞邊界」,但PostgreSQL的正則表達式不支持,所以(?:^|\W)(?!\w)辦法來模擬

+0

AFAIK,PostgreSQL的正則表達式中沒有單詞邊界,\ b表示退格。 – Toto

+0

沒錯,請參閱http://www.postgresql.org/docs/9.1/static/functions-matching.html#POSIX-LIMITS-COMPATIBILITY – araqnid

+0

啊,這真是一個恥辱。並且向前看被支持但不是向後看 - 會更新答案。乾杯! –

1

AFAIK,有一個在PostgreSQL的正則表達式沒有word boundary\b意味着退格

我會做:

SELECT '20'||substring('FUT,GRA,S12,1055559' from E'\\WS(\\d{2})\\W') 

其中\W指:不發一語字符