Regulärer Ausdruck gesucht

Fuselpower

Ensign
Registriert
Sep. 2008
Beiträge
204
Hallo.

Wie bekomme ich aus dem folgenden Code mittels regulärem Ausdruck nur das letzte "Test"?
Also nicht die beiden in den Quotes.

PHP:
'Das ist ein Test'

"Das ist ein Test"

Das ist ein Test

Nur die Quotes zu erhalten habe ich schon geschafft.
Diese zu "eleminieren" auch.
Sobald ich mir dann aber wieder Test anzeigen lassen will, kommen wieder alle 3 zu Vorschein.
 
ich würde jetzt sagen [^'"]Das ist ein Test.[^'"]
[^x] matched auf alles außer x.
ggf. musst du noch ' und " escapen.
 
@MoF: Was so allerdings nicht ganz funktioniert. [^"'] erwartet trotzdem, dass da ein Zeichen wäre...
Ich weiss ja nicht genau, was du willst, aber je nachdem Funktionierts auch einfach so: [A-Za-z .]+ oder halt einfach [^"']+
 
Bin mir nicht sicher ob ich verstehe was du willst.
Wenn du die Zeilen einzeln evaluierst, dann genügt doch
Test$
oder
Test\s*$
je nachdem ob whitespace folgen darf.

Möglicherweise ist auch relevant welche regexp Library in welchem Kontext verwendet wird, daher gib im Zweifelsfalle am besten mal Beispielcode der nur das nötigste zum testen umfasst.
 
Code:
       String g = "'Das ist ein Test' \"Das ist ein Test\" Das ist ein Test";
       System.out.println(g);

       g = g.replaceAll("([\"][^\"]*[\"])|([\'][^\']*[\']) ", "");
       System.out.println(g);
und schon bleibt nur das letzte da

du suchst also wahrscheinlich:
[^((["][^"]*["])|(['][^']*[']))]
 
Zuletzt bearbeitet:
Die Sprache ist Delphi, RegLib ist die TRegEx.
Grundsätzlich wäre aber ein RegEx-Ausdruck unabhängig von Delphi/TRegEx erstmal interessant.
Auf http://www.regexe.de/ kann man das gut testen.

Was ich möchte, ist das nur Test erreicht wird und nicht Das ist ein Test .
Die Strings sollen nicht berücksichtigt werden. Also alles ignorieren was in den Quotes (" & ') ist und dann nur das Wort Test ermitteln.

[^(["][^"]*["])|(['][^']*['])]
Markiert mir in oben genannter Seite alles :)
 
Willst du einfach prüfen ob Test im string vorkommt, oder willst du jeweils das letzte Wort der Zeile, exkl. Quotes?
 
Die Strings sollen ignoriert werden. Ob dort Test drin steht ist egal.
Ich möchte nur das Wort Test außerhalb der Strings & nur das Wort.
Wo es dann letztendlich steht ist egal - muß nicht an letzter Stelle sein, wie in dem Beispiel.

z.B. RegAusdruck: Test
Dann finde ich alle drei Test. Die aus den Strings will ich aber nicht :)
Das kann man bestimmt irgendwie ausschließen - erschließt sich mir aber nicht...
 
Code:
(.*?)((?<=^([^""^'']*(""''[^""^'']*""'')+)*[^""^'']*.))(GesuchtesWort)


Capture010.jpg
 
Fuselpower schrieb:
z.B. RegAusdruck: Test
Dann finde ich alle drei Test. Die aus den Strings will ich aber nicht :)
Das kann man bestimmt irgendwie ausschließen - erschließt sich mir aber nicht...

Wenn es geht, dann ist es nicht einfach...

Das was dem am nächsten kommt sind lookarounds. Damit kannst du schauen ob etwas vor oder nach dem Muster auftaucht.

Code:
Test(?!'|")

Matcht nur, wenn kein ' oder " folgt.
Code:
(?<=!'|")Test
Matcht, wenn kein ' oder " davor steht.

Was du nun möchtest ist komplizierter. Soweit ich dich verstehe sollte er auch bei
Code:
"Bla Test"
 Bla Test 
"Bla Test"
auf das mittlere Test Matchen. Du erreichst also nichts, wenn du angibst, dass davor oder dahinter kein " sein darf. Zudem sind die beiden Tests voneinander unabhängig.

Du müsstest im Grunde zählen können, dass die Anzahl der " (oder ') davor und dahinter identisch ist, damit die Strings alle geschlossen sind. Ich weiß nicht ob das mit irgendeiner RegExp implementation möglich ist.


Ich denke dass es wahrscheinlich besser wäre einen anderen Ansatz zu verfolgen.
Woher kommt denn der Test den du auswerten möchtest, in welchem Format ist er, und was genau soll damit passieren? Wenn man die komplette Problemstellung kennt finden sich wahrscheinlich geschicktere Lösungen für die jeweilige Zielprogrammiersprache.
Ergänzung ()

Orbmu2k schrieb:
Code:
(.*?)((?<=^([^""^'']*(""''[^""^'']*""'')+)*[^""^'']*.))(GesuchtesWort)

Wow... Glückwunsch :)
 
DjNDB schrieb:
Wow... Glückwunsch :)

Naja ist auch noch nicht perfekt findet aber im "MULTILINE" Mode alle Vorkommen vor und ausserhalb von Quotes. Dahinter dann aber nicht.

Bin auch deiner Meinug man solte eher hingehen und alle gequoteten Sachen suchen und dann die sachen die man haben will darauf überprüfen ob sie da drin sind oder sicht.
 
(.*?)((?<=^([^""^'']*(""''[^""^'']*""'')+)*[^""^'']*.))(GesuchtesWort)
Na, das ist doch mal ne Hausnummer - ich dachte mir schon, daß es mit vielen Klammern zu tun hat :)

Jedoch beinhaltet das "Look-arounds" & das beherrscht die TRegEx nicht - zu alt.

Werde den Text wohl händisch durchscannen müssen.
Das Einpflegen einer aktuellen RegEx-Unit würde einen Rattenschwanz weiterer Bearbeitungen von diversen Unit verlangen :(

An alle: Vielen Dank!
 
Fuselpower schrieb:
Jedoch beinhaltet das "Look-arounds" & das beherrscht die TRegEx nicht - zu alt.

Werde den Text wohl händisch durchscannen müssen.
Das Einpflegen einer aktuellen RegEx-Unit würde einen Rattenschwanz weiterer Bearbeitungen von diversen Unit verlangen :(

An alle: Vielen Dank!

Wie gesagt such einfach nach allen Vorkommen und ermittle dann bei jedem Treffer mittels einfachem RegEx ob der in Quotes ist oder nicht.
 
Zurück
Oben