iBaffiPro ha scritto:
Se mi chiamassi Torbjørn e volessi iscrivermi all’applicazione il mio nome non verrebbe accettato a causa di questo codice:
if (!Pattern.matches("[a-zA-Zàèéìòùç0-9 ]+", nomeUtenteScelto) || (nomeUtenteScelto.length() < 5)) {
errors.rejectValue("userName", "NomeUtente.appUserForm.userName");
}
No. Ha senso mettere una serie di caratteri così (es. "àèìòù" ecc...) SOLO se sono in numero ragionevolmente limitato perché bastano solo quelli.
Ma tanto per darti una idea, nel Java 16 che è allineato al Unicode 13.0, ci sono 283440 code-point definiti di cui 131241 sono considerati "lettere".
Quindi se ti basta considerare TUTTE le lettere come inteso nello standard Unicode, nelle regex ci sono diversi modi per descriverlo molto in generale:
\p{L} (L è la Category nel Unicode per Letter)
\p{isLetter} (come binary property)
EDIT: anzi, forse la category Letter è un po' troppo solo per dei nomi utente, perché L contempla anche gli Lo (other letter) che sono es. ª º ? e altri. Potrebbe bastare l'insieme delle categorie Ll (lowercase) e Lu (uppercase), quindi \p{Ll} e \p{Lu}
Queste cose sono spiegate nella documentazione di Pattern.
E se vuoi vedere le categorie:
https://www.compart.com/en/unicode/categor
iBaffiPro ha scritto:
il carattere ø viene inteso come speciale
No, il ø non è speciale. Nelle regex un carattere è "speciale" quando normalmente NON rappresenta sé stesso ma un concetto più particolare/ampio. Tipo il punto "." che descrive "un qualunque carattere". Se vuoi che il punto rappresenti esattamente sé stesso, lo devi escapare (brutto dirlo in italiano, meglio
escaped), ovvero \. che in una stringa literal nel sorgente vuol dire raddoppiare il backslash ovvero "\\."
Il ø matcha esattamente sé stesso (prova: stringa "aei
øu" e fai un find() con pattern "ø", lo trovi), quindi non è "speciale" per le regex.
iBaffiPro ha scritto:
Non esiste una stringa o una variabile in Spring Boot contenente tutte le lettere che possono essere usate in questo mondo, anche cinese, arabo, ecc…?
In Spring Boot dubito. Scusa ma guardare la documentazione di Pattern e documentarsi un po' sul Unicode?
iBaffiPro ha scritto:
Stavo anche pensando se le char in java sono ordinate in qualche modo intelligente
Cosa intendi per "ordinate in qualche modo intelligente"?? Java si basa sullo standard
Unicode, che contempla centinaia di migliaia di caratteri. E i char in Java vengono confrontati in base al codice Unicode del carattere.
iBaffiPro ha scritto:
Come scriverebbe un programmatore serio quelle espressioni regolari nel caso volesse fare un codice multilingua serio e senza reinventare la ruota?
L'ho detto brevemente prima, basta documentarsi su regex/Unicode.