2017-07-29 7 views
-1

Ich habe eine Spalte Kriterien, die in jedem seiner Reihe unter ähnlichem Text enthält: -wie man Text zwischen 2 Wörtern in postgresql extrahiert?

inclusion : ajjsdijd 
sdsjdjs 
ieroeito trorg inclusion 
sdkjwedk 

exclusion : 
sdkjwdowek 
ksdldk exclusion 
skdkefk 
kfkwkfwe 

Ich mag den Text zwischen dem ersten Ein- und Ausschluß Vorkommen extrahieren. Also, hier möchte ich das Ergebnis als

ajjsdijd 
sdsjdjs 
ieroeito trorg inclusion 
sdkjwedk 

Auch ich den Text nach dem ersten Ausschluss Schlüsselwort extrahieren möchten:

sdkjwdowek 
ksdldk exclusion 
skdkefk 
kfkwkfwe 

ich derzeit unter postgresql verwende aber dies erzeugt Ausgabe und nimmt Text zwischen der ersten Aufnahme und letzter Ausschluss.

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

Bitte könnten Sie helfen.

+0

Probieren Sie stattdessen eine Lazy Quantifier: '(. +?)' – Mateus

Antwort

2

Man könnte so etwas wie dies versuchen:

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

Bekam mich von 10s ... – Mateus

+0

@MateusA. Und gerade als ich auch ins Bett gehen wollte ... –

+0

+1 für den ganzen Code und die Zeit. Übrigens sollte der Text an der Spitze nicht wie ein Code formatiert sein ('Sie könnten so etwas versuchen:') – Mateus

2

Der Grund, warum es passiert ist, dass Sie eine Greedy quantifier verwenden.

Wiederholung in regex ist standardmäßig gierig: sie versuchen, so viele Wiederholungen wie möglich zu entsprechen, und wenn dies nicht funktioniert, und sie haben einen Rückzieher, sie versuchen, zu einer Zeit, ein weniger rep anzupassen, bis ein Übereinstimmung des ganzen Musters gefunden. Wenn eine Übereinstimmung schließlich eintritt, würde eine gierige Wiederholung so viele Wiederholungen wie möglich ergeben. -polygenelubricants

Was Sie müssen, ist es zu einem faulen Quantifizierer ändern tun, durch Hinzufügen des ? Betreiber:

/inclusion(.+?)exclusion/ 

Versuchen Sie, bei dieser Demo suchen: https://regex101.com/r/TYGBrA/1 (Beachten Sie den Doppelpunkt in Ihrem Eingang mit Ihren gegeben Regex, die auch mit der Sequenz \s*:\s* ignoriert werden könnte).

Verwandte Themen