Ich habe eine Regex für Portnummern gemacht (bevor Sie sagen, das ist eine schlechte Idee, es geht in eine größere Regex für URLs, die viel schwieriger ist als es klingt).
Mein Kollege hat gesagt, das ist wirklich schlimm und wird nicht alles fangen. Ich stimme nicht zu.
Ich glaube, dieses Ding fängt alles von 0 bis 65535 und nichts anderes, und ich suche eine Bestätigung dafür.
Einzeilige Version (für Computer):
%Vor%Lesbare Version:
%Vor%Kann jemand bestätigen, dass mein Verständnis korrekt ist (oder nicht)?
Sie könnten es erheblich verkürzen:
%Vor% Lassen Sie die führende 0*
fallen, wenn Sie führende Nullen nicht zulassen möchten.
Diese Regex ist auch besser, weil sie zuerst mit den Sonderfällen (65535, 65001 usw.) übereinstimmt und somit ein gewisses Zurückverfolgen vermeidet.
Oh, und da Sie gesagt haben, dass Sie dies als Teil eines größeren Regex für URLs verwenden möchten, sollten Sie dann sowohl ^
als auch $
durch \b
(Wortgrenzenanker) ersetzen.
Bearbeiten: @ceving fragt, ob die Wiederholung von 6553
, 655
, 65
und 6
wirklich notwendig ist. Die Antwort ist nein - Sie können auch eine geschachtelte Regex verwenden, anstatt diese führenden Ziffern zu wiederholen. Betrachten wir einfach den Abschnitt
Dies kann als
umgeschrieben werden %Vor%Ich würde argumentieren, dass dies die Regex noch weniger lesbar macht, als es bereits war. Der ausführliche Modus macht die Unterschiede ein wenig klarer. Vergleichen Sie
%Vor%mit
%Vor%Einige Leistungsmessungen: Das Testen jedes regulären Ausdrucks für alle Zahlen von 1 bis 99999 zeigt einen minimalen, wahrscheinlich irrelevanten Leistungsvorteil für die verschachtelte Version:
%Vor%Ausgabe:
%Vor%Nun, es ist einfach zu beweisen, dass es jeden korrekten Port validiert: Erzeuge einfach jede gültige Zeichenkette und teste, dass sie übergeben wird. Sicherzustellen, dass es nichts erlaubt, was nicht sollte, ist jedoch schwieriger - offensichtlich kann man nicht jede ungültige Zeichenkette absolut testen. Sie sollten auf jeden Fall einfache Fälle und alles, was Sie möglicherweise fälschen könnten, testen (oder das würde falsch mit einem niedrigeren Regex passieren - "65536" ist ein Beispiel).
Es wird jedoch einige etwas seltsame Portspezifikationen zulassen - wie beispielsweise "0000". Möchten Sie führende Nullen zulassen?
Sie sollten auch überlegen, ob Sie für jeden Fall separat ^ und $ angeben müssen oder ob Sie ^(case 1)|(case 2)|...$
verwenden könnten. Oh, und Quantifier könnten auch den Fall "1 bis 4 Ziffern" vereinfachen: ([0-9]{1,4})
findet zwischen 1 und 4 Ziffern.
(Vielleicht möchten Sie auch etwas weniger arrogant arbeiten. Wenn Sie mit anderen Leuten arbeiten, wird eine weniger aggressive Kommunikation wahrscheinlich mehr dazu beitragen, den Tag zu verbessern, als nur Ihre Regex zu beweisen richtig ...)
Was ist falsch daran, es in eine Zahl zu zerlegen und mit ganzzahligen Vergleichen zu arbeiten? (Unabhängig davon, ob dies Teil einer "größeren" Regex sein wird oder nicht).
Wenn ich Regex verwenden würde, würde ich einfach verwenden:
%Vor%Nein, es prüft nicht nach "gültigen" Portnummern (auch nicht nach Ihren). Aber es ist viel lesbarer und für praktische Zwecke würde ich sagen, es ist "gut genug".
PS: Ich würde daran arbeiten, bescheidener zu sein.Tags und Links regex