2016-08-26 5 views
1

Ich weiß, dass es in diesem Bereich viele Fragen gibt, aber ich habe keine gefunden, die mir helfen könnten oder eine Antwort auf mein Problem geben könnten, und als eine vollständige Regex-Neuzeit brauche ich deine Hilfe.Regex: Ist es möglich, einen Port und einen Port-Bereich mit einem Regex zu validieren?

Ich verwende diese regex Port-Nummern zu bestätigen:

^([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$ 

Aber ist es möglich, einen regulären Ausdruck zu erstellen, die sowohl portStart:portEnd einen einzigen Port-Nummer und einen Portbereich im Format validieren?

Beispiele:

erlaubt:

6112: 
:6113 
6112-7777 
27100(any other character than colon)28000 
+0

Die Portnummern sind, na ja ..., Zahlen. Ist es nicht einfacher, den String mit ':' oder '-' als Trennzeichen zu trennen, zu überprüfen, ob das Ergebnis genau eine oder zwei Komponenten enthält, und dann zu überprüfen, dass jede Komponente eine positive Zahl von nicht mehr als 65535 ist? Alle diese in mehreren Zeilen Code (abhängig von der Sprache, die Sie verwenden) und ohne (schwierig zu lesen und zu verstehen) regexp. – axiac

+0

Nun, es wäre kein großes Problem, die Funktionalität dafür zu implementieren, aber ich habe mich nur gefragt, ob das überhaupt möglich ist, da es eine optimale Lösung für meine aktuelle Aufgabe wäre. – BaconPancakes

+0

Es hängt davon ab, was du mit "optimal" meinst. Wenn Sie nach Millionen von Strings suchen müssen, ist die Regex-Lösung wahrscheinlich diejenige, die am schnellsten läuft (sicher, wenn Sie eine interpretierte Sprache verwenden). Andernfalls richten Sie sich auf die Lesbarkeit des Codes. Wenn die von Ihnen gepostete Regex funktioniert, verwenden wir 'X', um den inneren Teil zu bezeichnen (ohne die Start- und Endmarkierungen). Die gewünschte Regex ist etwas wie '^ X ([: -] X)? $'. Denken Sie daran, dass Sie auch prüfen müssen, ob der erste Port kleiner als der zweite ist, um einen gültigen Bereich zu haben, und dies ist nicht mit Regex möglich. – axiac

Antwort

3

EDIT:

6112 
6112:6120 
27015:28000 

Nicht erlaubt In Kommentaren, die Sie erwähnen, dass Sie durch die Bereichsprüfung überprüfen bedeuten, wenn der Teil erste Bereich ist niedriger als die zweite. Sicher, es ist nicht möglich mit Regex (nur .NET Regex kann das tun, aber das Muster wäre Overkill), aufgeteilt mit :, beide Blöcke zu Zahlen und vergleichen Zahlen.

Wenn Sie wollen nur sicherstellen, dass ein String ist entweder ein Port oder eine Reihe von Ports in beliebiger Reihenfolge, können Sie einen regulären Ausdruck mit einer optionalen Gruppe (?:<PATTERN_BLOCK>)? versuchen. Verwenden Sie eine Regex nur, wenn Sie keine dedizierte Programmiersprache verwenden können.

^([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])(?::([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?$ 

Brechen sie in Blöcke:

^      # Start of string 
    (     # Port number regex 
    [0-9]{1,4}| 
    [1-5][0-9]{4}| 
    6[0-4][0-9]{3}| 
    65[0-4][0-9]{2}| 
    655[0-2][0-9]| 
    6553[0-5] 
    ) 
    (?:     # Optional group start 
     :    # The port range delimiter 
     (    # Port number regex 
     [0-9]{1,4}| 
     [1-5][0-9]{4}| 
     6[0-4][0-9]{3}| 
     65[0-4][0-9]{2}| 
     655[0-2][0-9]| 
     6553[0-5] 
     ) 
    )?       # Optional group end 
$        # End of string 

anzeigen regex demo

+0

Danke, das war genau das was ich gesucht habe! Wie auch immer erwähnt, ich muss es teilen, um sicherzustellen, dass "portStart BaconPancakes

+0

Tatsächlich wird nicht überprüft, ob der erste Teil des Bereichs numerisch niedriger als der zweite Teil sein muss. Das kann nur mit .NET Regex auf eine sehr hässliche Weise gemacht werden. Mit dieser Regex können Sie nur sicherstellen, dass die Teile der Regex entsprechen, und wenn Sie Erfassungsgruppen über die Teile hinzufügen, können Sie sie abgleichen. Es ist natürlich ein Weg, die Werte zu teilen und sie zu Zahlen zu konvertieren und * Zahlen * zu vergleichen. –

+0

Hinweis: Dies entspricht dem Port "0", der ein gültiger Wert für Ihre Anwendung sein kann oder auch nicht (normalerweise nicht). – StockB

Verwandte Themen