2017-07-29 45 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*)。

相关问题