我有一个列标准,其每行包含以下类似的文字: -
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 :(得分: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*
忽略它。)