Come abbinare caratteri accentati con un’espressione regolare?

Sto eseguendo Ruby on Rails 3.0.10 e Ruby 1.9.2. Sto usando il seguente Regex per abbinare i nomi:

NAME_REGEX = /^[\w\s'"\-_&@!?()\[\]-]*$/u validates :name, :presence => true, :format => { :with => NAME_REGEX, :message => "format is invalid" } 

Tuttavia, se provo a salvare alcune parole come le seguenti:

 Oilalà Pì Rùby ... # In few words, those with accented characters 

Ho un errore di convalida "Name format is invalid. .

Come posso cambiare il Regex sopra così da abbinare anche caratteri accentati come à , è , é , ì , ò , ù , …?

Invece di \w , utilizzare l’ espressione parentesi POSIX [:alpha:] :

 "blåbær dèjá vu".scan /[[:alpha:]]+/ # => ["blåbær", "dèjá", "vu"] "blåbær dèjá vu".scan /\w+/ # => ["bl", "b", "r", "d", "j", "vu"] 

Nel tuo caso particolare, modifica la regex con questo:

 NAME_REGEX = /^[[:alpha:]\s'"\-_&@!?()\[\]-]*$/u 

Questo però corrisponde molto di più dei semplici personaggi accentati. Che è una buona cosa Assicurati di leggere questo post sul blog su idee sbagliate comuni riguardanti i nomi nelle applicazioni software.

Una soluzione sarebbe ovviamente quella di trovarli tutti semplicemente come li si usa normalmente, anche se presumo che possano essere abbastanza numerosi.

Se si utilizza UTF8, si scoprirà che tali caratteri sono spesso divisi in due parti, il carattere “base” stesso, seguito dall’accento (0x0300 e 0x0301 credo) chiamato anche carattere combinatorio. Tuttavia, questo potrebbe non essere sempre vero poiché alcuni caratteri possono anche essere scritti usando il codice carattere “hardcoded” … quindi è necessario normalizzare prima la stringa UTF8 in formato NFD.

Ovviamente, puoi anche trasformare qualsiasi stringa che hai in UTF8 e poi nel set di caratteri originale … ma il sovraccarico potrebbe diventare piuttosto grande se stai facendo operazioni di massa.

MODIFICA: per rispondere in modo specifico alla tua domanda, è probabile che la soluzione migliore normalizzi le tue stringhe nel modulo NPD UTF8, quindi aggiungi semplicemente 0x0300 e 0x0301 al tuo elenco di caratteri accettabili e qualsiasi altro carattere combinato che desideri consentire (come i punti in åäö, puoi trovarli tutti in “charmap” in Windows, guardare 0x0300 e “su”).