2010-12-17 5 views
1

Sollte 1-280 Eingabezeichen überprüfen, aber es hängt, wenn mehr als 280 Zeichen eingegeben werden.

Erläuterung Ich verwende die obige Regex, um die Länge der Eingabezeichenfolge auf maximal 280 Zeichen zu überprüfen. Ich benutze asp: RegularExpressionValidator, um das zu tun.

+0

Mehr als 280 ist nicht zwischen 1 und 280 inklusive. – Gumbo

+0

Wie groß ist die Eingabe? Kannst du etwas spezifischer über "hängen" sein? – dheerosaur

+0

@Gumbo das ist nicht der Punkt - anstatt nur versagen, es hängt, d. H. Eine übermäßig lange Zeit dauern. –

Antwort

4

Es gibt nichts "falsch" mit per se, aber es ist schrecklich, weil mit den meisten RE-Engines (Sie sagen nicht, welche Sie verwenden), wenn es nicht mit der ersten Sache übereinstimmt, weil es versucht Es bewirkt, dass die Engine zurückläuft und viele verschiedene Möglichkeiten ausprobiert (von denen keine jemals eine Übereinstimmung verursachen kann). Es ist also kein Problem, sondern nur eine Maschine, die versucht, zwei Operationen auszuführen, um zu sehen, ob eine Übereinstimmung möglich ist. Entschuldige, wenn ich nicht darauf warte!

Natürlich ist es theoretisch für den RE-Compiler möglich, den (.|\s)-Teil des RE in etwas zu verschmelzen, mit dem es nicht zurückzugehen braucht. Einige RE-Engines tun dies (typischerweise die mehr automatentheoretischen), aber viele nicht (die Stack-basierten).

+0

anzuzeigen Der Schlüssel zum Zusammenführen ist, ob die Engine '.' erkennen kann und '\ s', da beide Zeichensätze sind und sie zu einem einzigen Satz verschmelzen. Wenn es möglich ist, wird die RE in der garantierten linearen Zeit trivial. –

+0

Glaubst du, es gibt eine Möglichkeit, die Regex neu zu schreiben, um sie dann zu optimieren? –

+0

@JAngwenyi: In der Engine, die ich benutze, würde ich '^ [\ u0000-\ uffff] {1,280} $' machen, außer dass ich es nicht so machen würde (und der Motor hat auch Grenzen beim Zählen; es gibt andere Fälle, die viel fieser sind!) Kannst du wirklich nicht etwas anderes als einen RE benutzen, um diese Validierung durchzuführen? –

0

Es versucht jede mögliche Kombination von . und \s für jedes Zeichen, das versucht, eine Version des Musters zu finden, das der Zeichenkette entspricht.

. entspricht bereits einem beliebigen Zeichen, daher ist (.|\s) redundant. Weiter, wenn Sie nur überprüfen möchten, wie lang die Zeichenfolge ist, dann tun Sie einfach - warum ziehen Sie Regexes aus?

+2

'.' wird standardmäßig nicht mit newline übereinstimmen. – codaddict

+0

@codaddict exaclty! das, warum ich beide kombiniert (. | \ s), aber es scheint zu hängen, wenn –

+0

K bewertet, ich asp: RegularExpressionValidator verwendet, um Warnmeldung auf Clientseite –

0

Wenn Sie wirklich einen regulären Ausdruck verwenden möchten, könnten Sie .{1, 280}$ mit der SingleLine Option kombiniert verwenden, so dass die . metacharacter alles übereinstimmen, einschließlich der neuen Linien (siehe here, Regular Expression API Abschnitt).