Forum: PC-Programmierung Regulärer Ausdruck: alles außer


von Chris R. (mrgreen)


Lesenswert?

Hallo,
wie muss ein regulärer Ausdruck aussehen, der "alles außer 'test'" 
auswählt?

Ich dachte an sowas: [^test], aber der will es nicht tun?

MfG
Mr.Green

von Rolf Magnus (Gast)


Lesenswert?

> Ich dachte an sowas: [^test], aber der will es nicht tun?

Das wäre genau ein Buchstabe, der alles außer t, e und s sein darf.

von Chris (Gast)


Lesenswert?

[^test] matcht exakt einen Buchstaben, der nicht t und nicht e und nicht 
s ist. Das ist nicht das was du moechtest.

"alles ausser 'test'" ist allerdings nicht eindeutig genug, wuerde ich 
sagen.
Wenn du so einen Eingabe-String hast:
"abctestdef"
auf was soll der regulaere Ausdruck dann passen?

1. Auf "abc"?
2. Auf "abctes"?
3. Auf "def"?
4. Auf "estdef"?
5. Auf gar nichts, weil in dem String "test" vorkommt?



Ein match "abc" "def" ist nicht erreichbar mit regulaeren Ausdruecken, 
da das kein zusammenhaengender Substring von "abctestdef" ist.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

[^test] matcht genau ein Zeichen und zwar eines, das kein t, e oder s 
ist.

So wie die Frage jetzt formuliert ist kann man fast keine sinnvolle 
Antwort geben.

Die Problematik bei text vorm test und text danach liegt darin, dass 
man mit einem Regex-Ausdruck nicht text vorm  und text danach 
auswählen kann. Man kann mehrere Regex_Ausdrücke auswählen und dann 
kombinieren.

Ausdruck 1: "text vorm "
Ausdruck 2: "test"
Ausdruck 3: " und text danach"

In dem Fall würde man mit runden Klammern gruppieren und die so 
erzeugten Rückwärtsreferenzen neu arrangieren. Hier also \1 und \3 
behalten und \2 wegwerfen.

http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck

EDIT: Chris war schneller ;-)

von Chris R. (mrgreen)


Lesenswert?

Mich interessiert der Text drumherum gar nicht.

Der Java RegExp-Parser (->Matcher) prüft einfach, ob der übergebene 
String auf den Ausdruck passt.

Und ich will ihn dazu bringen, TRUE zu sagen, wenn ein String den Text 
"test" nicht enthält :)

Ich hoffe, das ist klarer geworden, was ich vorhab.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ach so. Prüfe einfach, ob der Text "test" enthält und negiere das 
Ergebnis.

von Chris R. (mrgreen)


Lesenswert?

Ein Workaround bringt mir nichts, ich brauch den regulären Ausdruck :(

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Das ist kein Workaround.

Du sagst dich interessiert der String an sich nicht, nur ob der String 
"test" darin enthalten ist. Wenn er NICHT drin ist, willst du TRUE 
haben.

Also fragst du den String ab, ob der String test enthalten ist (liefert 
TRUE oder FALSE) und bildest die logische Negation (macht aus dem FALSE 
das gewünschte TRUE).

Du kannst dir auch von hinten durchs Knie ins Auge schiessen. Mir wird 
das zu blöd und ich klinke mich jetzt hier aus.

von Chris R. (mrgreen)


Lesenswert?

Stefan "stefb" B. wrote:

> Du kannst dir auch von hinten durchs Knie ins Auge schiessen. Mir wird
> das zu blöd und ich klinke mich jetzt hier aus.

Ich weiß nicht, was daran zu blöd ist. Aber du scheinst es ja beurteilen 
zu können -.-

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Blöd? Du weisst nicht was daran blöd ist?

Blöd ist, Aufwand in etwas reinzustecken, bei dem nicht erklärt wurde, 
warum soviel Aufwand erforderlich ist und das angesichts der Tatsache, 
dass eine sehr einfache Lösung vorgeschlagen wurde, die jedoch 
kommentarlos abgelehnt wurde (EDIT: als Workaround disqualifiziert 
wurde).

Blöd genug?

von Chris (Gast)


Lesenswert?

Bitte schoen:

^([^t]*(t([^e]|e([^s]|s[^t]))|.{0,3}$)?)*$

Das Muster zum Erstellen dieses Ausdrucks ist nicht schwierig zu 
erkennen.

Allerdings wuerde ich eher diesen Ausdruck als "workaround" bezeichnen 
als das einfache Negieren einer Suche nach "test".

von Danny (Gast)


Lesenswert?

Huhu,

ich habe hier ein Mailscript, in welchem ich im Adminbereich reguläre 
Ausdrücke für Mails eingeben kann, die er löschen soll.

Ich lasse zum Beispiel Mails löschen, die ***SPAM*** im Betreff haben. 
Das funktioniert so:
/^\*\*\*SPAM\*\*\*/

Nun möchte ich alle Mails löschen, die RE: als Betreff haben.
Mails mit RE: Hallo im Betreff sollten aber dennoch ankommen. Wie kann 
ich mit einem regulären Ausdruck genau nur nach diesem RE: suchen ohne 
Beachtung von z.B. RE: Hallo?

Vielen Dank.
Liebe Grüße Danny

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.