Rexact
Cheatsheet

Regex network port number

The reference Stack Overflow question's author posted a regex with an unclosed parenthesis - a real syntax error. The top-voted answer (61 votes) fixes that, but its own comment history reveals two distinct real bugs, fixed one after another over the years: it used to accept "0000" as a valid port (a badly bounded low branch), then, once that was fixed, a residual typo ("655[0-3]" instead of "655[0-2]") let ports 65536 through 65539 slip through - a real bug that even caused a GitHub issue on an unrelated project. Here's today's fully corrected version, compared against these 3 real stages of its history.

/^([1-9][0-9]{0,3}|[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])$/
passes 20/20 cases

Comparison of existing patterns

SourcepatternScore on the corpusReDoS
Stack Overflow — regex de l'auteur de la question, telle que postée, parenthèse non fermée (erreur de syntaxe réelle)(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{0,3}does not compile—
Stack Overflow — forme historique de la réponse à 61 votes avant correction, acceptait « 0000 » (bug signalé en commentaire par elfan)^([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])$16 / 20safe
Stack Overflow — forme intermédiaire de la même réponse, faute de frappe résiduelle laissant passer les ports 65536-65539 (signalée en commentaire, avec un vrai ticket GitHub à l'appui)^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-3][0-9]|6553[0-5])$18 / 20safe

Implementation

const re = new RegExp("^([1-9][0-9]{0,3}|[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])$", "");
re.test(input);

Limits

  • Exclut le port 0, réservé et non attribuable à une application — cohérent avec la plage 1-65535 explicitement visée par la réponse source, mais certaines API systèmes (ex. « bind » avec le port 0 pour demander un port libre au hasard) l'acceptent dans un sens différent, hors du champ de cette regex.
  • Ne distingue pas les ports système (0-1023, réservés, nécessitant des privilèges élevés), les ports enregistrés (1024-49151) et les ports dynamiques/éphémères (49152-65535) : ces trois catégories partagent la même forme numérique, seule leur signification d'usage diffère.
  • Ne vérifie pas qu'un port donné est réellement ouvert, écouté par un service, ou disponible sur la machine visée : la forme seule ne dit rien de l'état réel du réseau.
  • N'accepte aucun zéro de tête (« 007 », « 0080 ») même si certains outils système ou fichiers de configuration l'admettent par tolérance : les rejeter reste plus sûr pour distinguer une saisie décimale d'une notation octale ambiguë.