2009-06-05 10 views
23

Mit PCRE, wie können Sie einen Ausdruck erstellen, der nur übereinstimmen, wenn eine Zeichenfolge nicht gefunden wird.Invert Übereinstimmung mit regexp

Wenn ich grep benutze (was ich nicht bin), würde ich die Option -v wollen.

Ein konkreteres Beispiel: Ich möchte meine Regexp übereinstimmen, wenn die Zeichenfolge foo ist nicht in der Zeichenfolge. So würde es passen bar würde aber nicht foobar.

+0

Welche Sprache verwenden Sie? – innaM

+0

Dies wird in einen Webservice eingegeben, der PCRE ankündigt. Also ist die Sprache PCRE, wirklich. –

+1

Duplizieren: http://stackoverflow.com/questions/850907/regular-expression-opposite –

Antwort

41

Okay, ich habe meinen regulären Ausdruck basierend auf der Lösung verfeinert, die Sie gefunden haben (die fälschlicherweise Strings entspricht, die mit "Test" beginnen).

^((?!foo).)*$ 

Dieser reguläre Ausdruck stimmt nur mit Zeichenfolgen überein, die foo nicht enthalten. Der erste Lookahead verweigert Strings, die mit 'foo' beginnen, und der zweite sorgt dafür, dass foo an keiner anderen Stelle in der Strings gefunden wird.

1

Es ist in der Tat fast ein Duplikat. Ich denke, die regex Sie suchen ist

(foo?!) *

3

Basierend auf Daniels Antwort, ich glaube, ich habe etwas, das funktioniert.

^(.(?!test))*$ 

Der Schlüssel ist, dass Sie benötigen die negative Behauptung auf jedes Zeichen in der Zeichenfolge

+0

Ich glaube nicht, dass dies auch funktionieren wird; Es wird die Zeichenfolge "Test" übereinstimmen. –

+0

Shoot - Sie haben Recht. Das ist gut genug für mein derzeitiges Szenario, da dieser Rand nicht trifft, aber das Problem nicht vollständig löst. –

+0

Ich löschte meine ursprüngliche Antwort und veröffentlichte eine neue, die das Problem vollständig lösen sollte, einschließlich der Randfall. Im Grunde hat meine ursprüngliche Antwort Strings abgelehnt, die mit dem Teilstring beginnen, und Yours Strings, die den Teilstring enthalten, aber nicht damit beginnen. Sie zusammenzubringen ist die Lösung. :) –

-1

Bauen ein Ausdruck, der übereinstimmt, und verwenden! match() ... (logische Negation) das ist wahrscheinlich, wie grep tut es trotzdem zu machen ...

+0

Ich habe keine Kontrolle über den Code, der das Match direkt bewertet, so dass dies leider keine Option ist. –