2008-10-13 24 views
33

Einfache Frage dieses Mal.RegEx, um festzustellen, ob eine Zeichenfolge ein bestimmtes Zeichen enthält

Ich versuche zu testen, ob eine Zeichenfolge kein Zeichen mit regulären Ausdrücken enthält. Ich dachte, der Ausdruck hätte die Form "[^ x]", wobei x das Zeichen ist, das nicht angezeigt werden soll, aber das scheint nicht zu funktionieren.

Zum Beispiel

Regex.IsMatch("103","[^0]") 

und

Regex.IsMatch("103&","[^&]") 

beide return true (ich würde erwarten, false).

Ich begann als \ zu entkommen "[^&]" und dachte, vielleicht die & Bedarf mit &, aber es scheint keinen Unterschied zu machen.

Ideen? Ich nehme an, es ist etwas Kleines.

Auch ich benutze .NET, also behalte das im Hinterkopf.

Edit1:

Ich fand this, aber es scheint nicht das Problem zu beantworten, das ich habe.

Edit2:

Ich wollte Kevin und Joel ‚s Vorschläge reagieren. Diese Vorschläge wären in der Tat schneller, aber sie erreichen nicht die Flexibilität, die ich in diesem Fall brauche. Wenn Sie also diese Frage über die Suche gefunden haben, schauen Sie sich auf jeden Fall an, ob ihre Antworten Ihren Anforderungen entsprechen. In meinem Fall wird der reguläre Ausdruck an eine DataTable-Validierungsmethode übergeben, die jede Zeile durchläuft und überprüft, ob der Inhalt dieser Zeile in einer bestimmten Spalte mit der RegEx übereinstimmt, die übergeben wird. Da ich diese Methode erneut verwenden werde für einige andere Datentabellen, die validiert werden, wollte ich:

  1. Verwendung Regex die breiteste Palette von Validierungen zu ermöglichen, und
  2. Immer für eine positive Übereinstimmung (dh anstelle der Verwendung Regex.IsMatch (Zelle! (regexvariable), ich wollte immer Reyx.IsMatch (Zelle, Regexvariable) verwenden können, da die Mehrheit der DataTables, die diese Methode aufrufen, die positive Übereinstimmung anstelle der negativen verwenden wird

Hoffentlich hilft das.

+0

Wenn Sie nur auf das Vorhandensein eines einzelnen Zeichens überprüft, können Sie viel besser ohne Regexen. Kevin hat recht: benutze .IndexOf() oder etwas einfacheres. Es wird lesbarer, klarer und schneller sein. – ruquay

Antwort

51

Ihre Lösung ist halb richtig. Das Spiel, das du siehst, ist für die anderen Charaktere. Was du sagen willst, ist so etwas wie "hey! Ich möchte diesen Charakter nicht in der ganzen Zeichenfolge sehen".

In diesem Fall können Sie tun:

Regex.IsMatch("103","^[^0]*$") 
+0

Danke! Ich hatte auch "^ [^ 0] $" versucht, aber auf die^und $ verzichtet, da alles zu "false" führte - nur das Sternchen. Danke nochmal - meine "zwei Probleme" sind jetzt wieder auf Null. – jerhinesmith

+4

Ich würde vermuten, dass Regex.IsMatch ("103", "0") eigentlich schneller wäre. – Kip

+0

Ich benutze dies, ich will nicht die Zeichen '' '' '' '' '' '' Ich habe versucht^^ [^?] * $ ', Die für' '' basierend auf dem oben genannten funktionierte Beispiel, aber wenn ich die Klammernzeichen hinzufüge, funktioniert es nicht ... '^ [^? []] * $' – raffian

4

Das erste Zeichen der Parser erreicht ist "1", was für [^ 0] und gilt auch für [^ &], so also wahr ist, es wird wieder wahr in diesen beiden Beispielen.

7

Wenn Sie nach einem einzelnen Zeichen in einer Zeichenfolge suchen, scheint Regex wie ein bisschen ein Overkill. Warum nicht einfach .IndexOf oder .Contains verwenden?

+0

Das würde funktionieren, aber ich versuche, einen DataTable-Validator mit Dekoratoren zu schreiben, und ich wollte eine Methode, die es mir erlauben würde, auf andere String-Übereinstimmungen zu erweitern (sei es inklusive oder exklusiv). – jerhinesmith

2

Sie setzen Ihre Negation an die falsche Stelle. [^x] passt alles an, was nicht x ist. Wenn x in der Zeichenfolge ist, stimmt die Zeichenfolge immer noch mit dem Ausdruck überein, wenn auch andere Zeichen vorhanden sind. Stattdessen möchten Sie wahr passen, wenn x ist, und negiert dann das Ergebnis der Funktion:

Not Regex.IsMatch("103", "0") 

Not Regex.IsMatch("103&", "&") 

Nicht, dass mit diesen einfachen Beispielen, die normale String.IndexOf() oder String.Contains() wäre eine bessere Wahl.

16

Das Muster [^ 0] entspricht einem beliebigen Zeichen, das keine Null ist. In beiden Beispielen entspricht das Muster dem ersten Zeichen ("1"). Um zu testen, ob die gesamte Zeichenfolge keine Nullen enthält, sollte das Muster "^ [^ 0] * $" lauten. Dieser lautet wie folgt: Beginnen Sie am Anfang der Zeichenfolge, passen Sie eine beliebige Anzahl von Zeichen an, die keine Nullen sind, unmittelbar gefolgt vom Ende der Zeichenfolge. Jede Zeichenfolge, die eine Null enthält, schlägt fehl. Jede Zeichenfolge, die keine Nullen enthält, wird übergeben.

+1

Große Erklärung! – Mez

2

Ich stieß auf diese Frage auf der Suche nach der gleichen Sache, aber für JavaScript. Der obige Ausdruck funktionierte in meinem Fall nicht, aber ich stieß auf den folgenden Ausdruck, der das tat. (Für den Fall, jemand sucht sonst für eine JavaScript-Lösung endet hier auch auf.)

^((?! 0).) * $

Verwandte Themen