Mappatura dei valori enum in regex

1

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}

    
posta Chris Cirefice 14.08.2016 - 17:28
fonte

2 risposte

1

Personalmente, non userei nemmeno regex per convalidare la stringa :) È una convalida abbastanza semplice da essere scritta a mano e, così facendo, il problema scompare.

Ma, supponendo che tu voglia mantenere la regex, allora preferisco la tua prima opzione:

(DEPARTMENTS.values.join('|'))\s[0-9]{3}-[0-9]{2}

È ASCIUTTO e il suo unico inconveniente è che rende la regex un po 'più difficile da ragionare. Ma, considerando che essere "difficili da ragionare" è una specie di regex, non ci lavoro troppo.

Se, tuttavia, ti trovi nella posizione eccentrica in cui scegli di mantenere il tuo approccio originale:

(ARA|CHI|FRE|GER|ITA|JPN|RUS|SPA)\s[0-9]{3}-[0-9]{2}

Quindi puoi sempre scrivere un test unitario che verifichi la regex precedente includa tutti (e solo tutti) i tuoi reparti.

    
risposta data 14.08.2016 - 20:47
fonte
0

È una buona idea mantenere solo l'elenco dei reparti in un unico posto.

Mentre la tua tecnica è valida preferirei semplicemente estrarre il dipartimento usando un gruppo di espressioni regolari.

([A-Z]{3})\s[0-9]{3}-[0-9]{2}

Ora il reparto dovrebbe essere disponibile nel gruppo 1

Quando viene estratto, controlla che il dipartimento sia incluso nel tuo elenco.

    
risposta data 14.08.2016 - 17:59
fonte