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
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| 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 / 20 | safe |
| 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 / 20 | safe |
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ë.