35 Stimmen

RegEx, um festzustellen, ob ein String kein bestimmtes Zeichen enthält

Einfache Frage dieses Mal.

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

Zum Beispiel,

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

und

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

geben beide true zurück (ich würde false erwarten).

Ich habe mit "[^&]" begonnen und gedacht, dass das & als \& escaped werden muss, aber das schien keinen Unterschied zu machen.

Ideen? Ich nehme an, es ist etwas Kleines.

Außerdem benutze ich .NET, also behalte das im Hinterkopf.

Bearbeiten1:

Ich habe dieses gefunden, aber es scheint nicht das Problem zu beantworten, das ich habe.

Bearbeiten2:

Ich wollte auf die Vorschläge von Kevin und Joel antworten. Diese Vorschläge wären in der Tat schneller, erfüllen aber nicht die Flexibilität, die ich in diesem Fall benötige. Wenn Sie diese Frage über die Suche gefunden haben, schauen Sie auf jeden Fall nach, ob ihre Antworten Ihren Anforderungen entsprechen. In meinem Fall wird der reguläre Ausdruck in eine DataTable-Validierungsmethode übergeben, die jede Zeile durchläuft und überprüft, ob der Inhalt dieser Zeile in einer bestimmten Spalte mit dem übergebenen RegEx übereinstimmt. Da ich diese Methode für mehrere andere DataTables wiederverwenden werde, die validiert werden, wollte ich:

  1. Regex verwenden, um den breitesten Bereich von Validierungen zu ermöglichen, und
  2. immer nach einer positiven Übereinstimmung suchen (d.h. anstatt !Regex.IsMatch(zelle, regexvariable) zu verwenden, wollte ich mich immer darauf verlassen können, Regex.IsMatch(zelle, regexvariable) zu verwenden, da die Mehrheit der DataTables, die diese Methode aufrufen, die positive Übereinstimmung anstelle der negativen verwenden wird.

Hoffentlich hilft das.

0 Stimmen

Wenn Sie nur das Vorhandensein eines einzelnen Zeichens überprüfen, können Sie viel besser ohne Regexes auskommen. Kevin hat recht: Verwenden Sie .IndexOf() oder etwas Einfacheres. Es wird lesbarer, klarer und schneller sein.

54voto

Jorge Ferreira Punkte 92489

Ihre Lösung ist halb richtig. Der Treffer, den Sie sehen, gilt für die anderen Zeichen. Was Sie sagen möchten, lautet ungefähr "hey! Ich möchte dieses Zeichen nicht im gesamten String sehen".

In dem Fall machen Sie das:

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

0 Stimmen

Danke! Ich hatte auch versucht "^[^0]$", aber auf das ^ und $ verzichtet, da alles zu falsch ausgewertet wurde – ich brauchte nur diesen Stern. Nochmals vielen Dank – meine "zwei Probleme" sind jetzt bei null.

4 Stimmen

Ich würde vermuten, dass !Regex.IsMatch("103","0") tatsächlich schneller wäre.

0 Stimmen

Ich benutze das, das ich nicht Zeichen ?, [ und ] sehen möchte, Ich habe probiert ^[^?]*$, das hat für ? basierend auf dem oben Beispiel funktioniert, aber wenn ich die Klammern hinzufüge, funktioniert es nicht... ^[^?[]]*$

17voto

Ken Paul Punkte 5597

Das Muster [^0] wird mit jedem Zeichen übereinstimmen, das keine Null ist. In beiden Beispielen wird das Muster das erste Zeichen ("1") übereinstimmen. Um zu überprüfen, ob der gesamte String keine Nullen enthält, sollte das Muster "^[^0]*$" sein. Dies liest sich wie folgt: Beginnen Sie am Anfang des Strings, stimmen Sie eine beliebige Anzahl von Zeichen ab, die keine Nullen sind, gefolgt unmittelbar vom Ende des Strings. Jeder String, der eine Null enthält, schlägt fehl. Jeder String, der keine Nullen enthält, besteht.

7voto

Kevin Punkte 6913

Wenn Sie nach einem einzelnen Zeichen in einem String suchen, scheint Regex ein wenig übertrieben. Warum nicht einfach .IndexOf oder .Contains verwenden?

0 Stimmen

Das würde funktionieren, aber ich versuche, einen DataTable-Validator unter Verwendung von Dekoratoren zu schreiben, und ich wollte eine Methode, die es mir erlauben würde, auf andere Zeichenfolgenübereinstimmungen zu erweitern (sei es inklusiv oder exklusiv).

4voto

stephenbayer Punkte 12054

Das erste Zeichen, das der Parser erreicht, ist "1", was für [^0] und auch für [^&] wahr ist, daher wird es in beiden Beispielen wahr zurückgeben.

2voto

Joel Coehoorn Punkte 377088

Du setzt deine Verneinung am falschen Ort. [^x] wird alles passen, was nicht x ist. Wenn x im String ist, passt der String trotzdem zum Ausdruck, wenn es auch andere Zeichen gibt. Stattdessen möchtest du wahr passen, wenn x da ist, und dann das Ergebnis der Funktion verneinen:

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

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

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X