2012-12-17 8 views
5

Wie kann ich bereits vorhandene Regex's mit einem Attribut erweitern, das besagt, dass die Regex eine maximale Länge von (sagen wir) 255 nicht überschreiten kann?Hinzufügen von "Max Length" zu Regex

Ich habe die folgende Regex bekam:

([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)

ich es so versucht haben, aber nicht:

{.,255([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)}

+1

überprüfen Sie die Länge des verglichenen Ergebnisses? – Cameron

+0

'{., 255}' Nach dem Ausdruck. –

Antwort

10

Der beste Weg, dies zu tun, wenn es sich um eine rein regexbasierte Lösung handelt, wäre die Verwendung von Lookarounds.

ansehen Beispiel: http://regex101.com/r/yM3vL0

Was ich hier mache nur Strings ist passend, die lang höchstens drei Zeichen sind. Zugegeben, für mein Beispiel ist das nicht der beste Weg. Aber ignoriere das, ich versuche nur ein Beispiel zu zeigen, das für dich funktionieren wird.

Sie haben auch Ihre Muster zu verankern, sonst wird der Motor nur das Lookarounds ignorieren (muss ich dies in der Tiefe erklären?)

Mit anderen Worten: Sie folgende in Ihrem regulären Ausdruck verwenden können, zu begrenzen, es höchstens 255 Zeichen:

^(?!^.{256})([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?) 

ich glaube auch, es ist meine Pflicht, Sie Ihren regulären Ausdruck zu sagen, ist schlecht und Sie sollten schlecht fühlen.

+0

+1, du hast natürlich vollkommen recht. Ich habe den Regex vollständig entfernt.Aber trotzdem hat dein Beitrag mir geholfen, Regex besser zu verstehen :) Danke dafür! – SeToY

+1

Kein Problem! Überprüfen Sie das Quiz auf http://www.regex101.com/quiz/, wenn Sie Regex noch besser verstehen wollen :) –

+0

@Lindrian danke für den Link. –

0

Ein regex nicht wirklich alles gemacht wird, lösen Probleme. In diesem Fall würde ich vorschlagen, dass das Testen einer Länge von 255 teuer sein wird, da dies 255 Zustände in der zugrunde liegenden Repräsentation erfordert. Testen Sie stattdessen einfach die Länge der Zeichenfolge.

Aber wenn Sie wirklich müssen, werden Sie benötigen, um Ihre Zeichen optional zu machen, so etwas wie:

.?{255} 

Wird eine beliebige Zeichenfolge von 255 oder weniger Zeichen entsprechen.

+0

Aber erlaubt es jedem, 255 zufällige Zeichen vor Ihre E-Mailadresse zu setzen !!! – jessehouwing

1

Warum nicht einfach nach Max Länge der Saite suchen? Wenn Sie DataAnnotations verwenden, können Sie [StringLength (255)] in der Eigenschaft beibehalten.

Wenn Sie ASP.NET-Validatoren verwenden, können Sie einen RangeValidator verwenden.

Wenn Sie eine benutzerdefinierte Validierungsfunktion verwenden, ist es viel besser lesbar (und schneller), die Länge zu überprüfen, bevor Sie eine komplexe Regex dagegen werfen.

0

You "kann" die Lage sein, einen Vorgriff wie folgt zu verwenden: So

^(?=.{0,255}$)your regex here$ 

...

^(?=^.{0,255}$)([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$