Stimmt irgendjemand mit meiner Regex für Portnummern?

8

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)?

    
asdadas 15.09.2010, 06:06
quelle

8 Antworten

26

Sie könnten es erheblich verkürzen:

%Vor%
  • keine Notwendigkeit, die Anker jedes Mal zu wiederholen
  • keine Notwendigkeit für viele einfangende Gruppen
  • keine Wiederholungen buchstabieren.

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

%Vor%

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%     
Tim Pietzcker 15.09.2010 06:14
quelle
8

Persönlich würde ich nur eine Zahl zusammenbringen und dann würde ich mit Code überprüfen, dass die Nummer in Reichweite ist.

    
gpeche 15.09.2010 06:20
quelle
6

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 ...)

    
Jon Skeet 15.09.2010 06:13
quelle
3

Eine Stilnotiz:

Die wiederholte Wiederholung von [0-9] ist albern - etwas wie [0-9][0-9][0-9] ist viel besser als \d{3} geschrieben.

    
Amber 15.09.2010 06:13
quelle
3

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.

    
NullUserException 15.09.2010 06:35
quelle
2
%Vor%     
Andrew Cooper 15.09.2010 06:25
quelle
0

regex hat viele implementieren, was die paltform. versuche es unten, entferne Leerzeichen

%Vor%

lesbar

%Vor%     
guilin 桂林 15.09.2010 06:20
quelle
0

Ich würde dies eins:

%Vor%

Das folgende Perl-Skript testet einige Zahlen:

%Vor%

Die Ausgabe ist:

%Vor%     
ceving 09.11.2015 12:54
quelle

Tags und Links