2010-12-11 9 views
1

Ich habe studiert gerade die RegEx und ich finde mich aus diesem folgende Gegenbeispiel verwirrendRegEx prob mit einem Bereich in einer Halterung

Regex pattern = new Regex("[^1]{1,}"); 
string challenge = "1234"; 
Console.WriteLine(pattern.IsMatch(challenge)); 

Es gibt „True“ auf der Konsole. Aus meinem Verständnis sollte es ein "False" -Ergebnis ergeben, da in der Challenge-Zeichenfolge eine "1" enthalten ist. Während dieser Code

Regex pattern = new Regex("[^1-5]{1,}"); 
string challenge = "1234"; 
Console.WriteLine(pattern.IsMatch(challenge)); 

Das Ergebnis funktioniert gut ist "False" wie erwartet.

Hat jemand eine Idee, was mit dem ersten Code vor sich geht?

Antwort

4

Sie verankern die Regex nicht. Daher ist es möglich, einen beliebigen Teilstring der Challenge-Zeichenfolge zu entsprechen. (Der Teil „234“ ist passend zum Ausdruck.) Try this:

Regex pattern = new Regex("^[^1]{1,}$"); 

Die zweite regex nicht die Zeichenfolge Übereinstimmen, da kein Teil der Challenge-Zeichenfolge entspricht den Ausdruck „mindestens ein Zeichen, mit Ausnahme der Zeichen 1, 2, 3, 4 und 5.

Kurz gesagt: Wenn Sie möchten, dass die Regex mit der gesamten Zeichenfolge übereinstimmt, denken Sie daran, den Ausdruck immer zu verankern, .

+0

Vielen Dank cdhowie –

1

Sie erwähnen nicht die Sprache, ich denke, es ist C#? Wenn isMatch() äquivalent zu pythons pattern.search (string) ist, stimmt es mit "234" überein, von denen alle "nicht 1" sind.

4

[^1]{1,} bedeutet nur übereinstimmen mit einer beliebigen Zeichenfolge, die nicht 1 enthält und eine Länge von mindestens 1 hat.

1234 enthält die Sequenz, die nicht 2341 enthält, und hat eine Länge 3.

1

Der Strangteil "234" die Regex entspricht. Es ist eine Zeichenfolge bestehend aus 1 oder mehr Vorkommen von nicht 1.

Verwandte Themen