Sto facendo un po 'di pulizia del codice e sto guardando le mie regex. Ne ho uno estremamente semplice:
(ARA|CHI|FRE|GER|ITA|JPN|RUS|SPA)\s[0-9]{3}-[0-9]{2}
Fondamentalmente convalida gli identificatori di corso per un dipartimento specifico (Lingue e letterature moderne) presso la mia università, ad es. FRE 101-01
è valido, CIS 101-01
no; Non posso semplicemente usare [A-Z]{3}
.
Ho già una costante di classe DEPARTMENTS
:
DEPARTMENTS = {
arabic: "ARA",
chinese: "CHI",
french: "FRE",
german: "GER",
italian: "ITA",
japanese: "JPN",
russian: "RUS",
spanish: "SPA"
}
Questo è Ruby, ma potrebbe probabilmente applicarsi a qualsiasi lingua: è una buona idea mappare l'enum nella regex invece di elencare esplicitamente i valori? Ecco cosa intendo. In Ruby, potrei costruire la regex come:
(DEPARTMENTS.values.join('|'))\s[0-9]{3}-[0-9]{2}
Probabilmente sarebbe simile in altre lingue, forse meno conciso in quelle statiche. Ho diverse enumerazioni che vanno in questo tipo di convalida regex. Il vantaggio di quest'ultimo approccio, a quanto vedo, è che ho solo bisogno di aggiornare un punto nel codice se aggiungiamo o rimuoviamo un reparto. Il sacrificio è un po 'leggibile. Certo, regex ed enum vivono nella stessa classe (in tutti i casi) quindi sarebbe abbastanza difficile dimenticare anche aggiornare la regex e trovare DEPARTMENTS
per sapere quali valori avrebbe preso tutti i 5 secondi extra ...
è:
(DEPARTMENTS.values.join('|'))\s[0-9]{3}-[0-9]{2}
più appropriato di:
(ARA|CHI|FRE|GER|ITA|JPN|RUS|SPA)\s[0-9]{3}-[0-9]{2}