Frage

Einfache Frage diesmal.

Ich versuche zu testen, ob eine Zeichenfolge kein Zeichen mit regulären Ausdrücken enthält oder nicht. Ich dachte, der Ausdruck wäre von der Form [^x] wo x ist der Charakter, den Sie nicht erscheinen möchten, aber das scheint nicht zu funktionieren.

Zum Beispiel,

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

und

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

Beide kehren zurück (ich würde falsch erwarten).

Ich fing an zu benutzen "[^&]" Und dachte vielleicht, dass das & musste als &, aber es schien keinen Unterschied zu machen.

Ideen? Ich nehme an, es ist etwas Kleines.

Außerdem verwende ich .NET, also denken Sie daran.

Edit1:

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

Edit2:

Ich wollte darauf antworten Kevin und JoelVorschläge. Diese Vorschläge wären in der Tat schneller, aber sie erreichen nicht die Flexibilität, die ich in diesem Fall benötige. Wenn Sie diese Frage also durch die Suche gefunden haben, suchen Sie auf jeden Fall, ob ihre Antworten zu Ihren Anforderungen entsprechen. In meinem Fall wird der reguläre Ausdruck an eine Dataatable -Validierungsmethode übergeben, die sich durch jede Zeile durchschlägt und überprüft, ob der Inhalt dieser Zeile in einer bestimmten Spalte mit dem Regex übereinstimmt, das übergeben wird. Da ich diese Methode wiederverwenden werde Für mehrere andere Datentables, die validiert werden, wollte ich:

  1. Verwenden Sie Regex, um den breitesten Validierungsbereich zu ermöglichen, und
  2. Suchen Sie immer nach einer positiven Übereinstimmung (dh anstatt! Regex.isMatch (Cell, Regexvariable) zu verwenden, ich wollte mich darauf verlassen die positive Übereinstimmung anstelle des Negativen.

Hoffentlich hilft das.

War es hilfreich?

Lösung

Ihre Lösung ist halb richtig. Das Spiel, das Sie sehen, ist für die anderen Charaktere. Was Sie sagen möchten, ist so etwas wie "Hey! Ich möchte diesen Charakter nicht in der gesamten Zeichenfolge sehen".

In diesem Fall tun Sie:

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

Andere Tipps

Das Muster [^0] stimmt mit jedem Charakter überein, das nicht Null ist. In beiden Beispielen entspricht das Muster dem ersten Charakter ("1"). Um zu testen, ob die gesamte Zeichenfolge keine Nullen enthält, sollte das Muster "^[^0]*$" sein. Dies lautet wie folgt: Beginnen Sie am Anfang der Zeichenfolge, stimmen Sie mit einer willkürlichen Anzahl von Zeichen an, die keine Nullen sind, gefolgt vom Ende der Zeichenfolge. Jede Zeichenfolge, die eine Null enthält, schlägt fehl. Jede Zeichenfolge, die keine Nullen enthält, vergehen.

Wenn Sie nach einem einzigen Zeichen in einer Zeichenfolge suchen, scheint Regex ein bisschen Overkill zu sein. Warum nicht einfach .Indexof oder .contains?

Der erste Charakter, den der Parser erreicht, ist "1", was für [^0] und auch für [^&] zutreffend ist. Daher wird er in diesen beiden Beispielen wahr zurückkehren.

Sie setzen Ihre Negation an den falschen Ort. [^x] wird mit allem übereinstimmen, 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 true übereinstimmen, wenn X da ist, und dann das Ergebnis der Funktion negieren:

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

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

Nicht das mit diesen einfachen Beispielen wäre die normale String.indexof () oder String.contains () eine bessere Wahl.

Ich bin auf diese Frage gestoßen, die nach dasselbe gesucht habe, aber nach JavaScript. Der obige Ausdruck funktionierte in meinem Fall nicht, aber ich stieß auf den folgenden Ausdruck, der tat. (Nur für den Fall, dass jemand anderes nach einer JavaScript -Lösung sucht.)

^((?!0).)*$

Dieses Konstrukt wird a genannt Negativer Lookahead

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top