2017-07-29 82 views
-1

我有一個包含類似如下的文字在其每個行的一列標準: -如何在postgresql中的2個單詞之間提取文本?

inclusion : ajjsdijd 
sdsjdjs 
ieroeito trorg inclusion 
sdkjwedk 

exclusion : 
sdkjwdowek 
ksdldk exclusion 
skdkefk 
kfkwkfwe 

我想提取第一納入和排除次數之間的文本。所以,在這裏我想結果爲

ajjsdijd 
sdsjdjs 
ieroeito trorg inclusion 
sdkjwedk 

另外,我想先排除關鍵字後,提取文本:

sdkjwdowek 
ksdldk exclusion 
skdkefk 
kfkwkfwe 

我目前使用下面的PostgreSQL,但是這造成的問題,並挑選第一包容之間的文本並最後排除在外。

substring(lower(criteria) from 'inclusion(.+)exclusion') 
substring(lower(criteria) from 'exclusion(.+)') 

請你幫忙。

+0

嘗試使用一個惰性量詞代替:'(。+?)' – Mateus

回答

2

你可以嘗試這樣的事:

DO $$ 
DECLARE input1 TEXT; 
DECLARE output1 TEXT; 
DECLARE output2 TEXT; 
declare posincl integer; 
declare posexcl integer; 
BEGIN 
    input1 := 'inclusion : ajjsdijd 
    sdsjdjs 
    ieroeito trorg inclusion 
    sdkjwedk 

    exclusion : 
sdkjwdowek 
ksdldk exclusion 
skdkefk 
kfkwkfwe' ; 
    posincl := position('inclusion :' in input1); 
    posexcl := position('exclusion :' in input1); 
    output1 := substring(input1 from (posincl + 11) for (posexcl - posincl - 11)); 
    output2 := substring(input1 from (posexcl + 11)); 
    RAISE NOTICE 'Value of output1: %', output1; 
    RAISE NOTICE 'Value of output2: %', output2; 
END $$; 
+0

讓我知道了10秒... – Mateus

+0

@MateusA。就像我還要去睡覺一樣...... –

+0

整個代碼和時間+1。順便說一下,頂部的文本不應該被格式化爲代碼('你可以嘗試這樣的:') – Mateus

2

爲什麼會發生的原因是,您使用的是貪婪的量詞。

重複在默認情況下,正則表達式是貪婪的:他們試圖儘可能多的代表匹配越好,當這並不工作,他們不得不原路返回,他們試圖少一個代表在一個時間匹配,直到找到整個模式的匹配。結果,當一場比賽最終發生時,貪婪的重複將盡可能地匹配儘可能多的代表。 -polygenelubricants

,你所要做的就是將其更改爲懶惰量詞,加入?操作:

/inclusion(.+?)exclusion/ 

試着看一下這個演示:https://regex101.com/r/TYGBrA/1(請注意您的輸入結腸與給定正則表達式,這也可以忽略與序列\s*:\s*)。

相關問題