如何在PostgreSQL中的2个单词之间提取文本?

时间:2017-07-29 18:16:22

标签: regex postgresql

我有一个列标准,其每行包含以下类似的文字: -

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(.+)')

2 个答案:

答案 0 :(得分: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 $$;

答案 1 :(得分:2)

它发生的原因是你正在使用贪婪量词。

  

默认情况下重复使用正则表达式是贪婪的:他们尝试匹配尽可能多的代表,当这不起作用并且他们必须回溯时,他们尝试一次匹配少一个代表,直到匹配找到了整个模式。结果,当匹配最终发生时,贪婪的重复将匹配尽可能多的代表。 -polygenelubricants

您需要做的是通过添加?运算符将其更改为Lazy量词:

/inclusion(.+?)exclusion/

尝试查看此演示:https://regex101.com/r/TYGBrA/1(请注意输入中使用给定正则表达式的冒号,也可以使用序列\s*:\s*忽略它。)