web-dev-qa-db-fra.com

Comment faire correspondre des caractères accentués avec une expression régulière?

J'utilise Ruby on Rails 3.0.10 and Ruby 1.9.2. J'utilise le Regex suivant pour pour faire correspondre les noms:

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

validates :name,
  :presence   => true,
  :format     => {
    :with     => NAME_REGEX,
    :message  => "format is invalid"
  }

Cependant, si j'essaie de sauvegarder quelques mots comme les suivants:

Oilalà
Pì
Rùby
...

# In few words, those with accented characters

J'ai une erreur de validation "Name format is invalid..

Comment puis-je changer le Regex ci-dessus afin de faire correspondre les caractères accentués comme à, è, é, ì, ò, ù, ...?

32
user502052

Au lieu de \w, utilisez expression de support 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"]

Dans votre cas particulier, changez l'expression régulière en ceci:

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

Cependant, cela correspond bien plus que des caractères accentués. Ce qui est une bonne chose. Assurez-vous de lire cette entrée de blog sur les idées fausses courantes concernant les noms dans les applications logicielles.

57
Lars Haugseth

Une solution serait bien sûr de simplement les trouver tous simplement les utiliser comme vous le feriez normalement, bien que je suppose qu'ils peuvent être assez nombreux.

Si vous utilisez UTF8, vous constaterez que ces caractères sont souvent divisés en deux parties, le caractère "de base" lui-même, suivi de l'accent (0x0300 et 0x0301 je crois) également appelé caractère de combinaison. Cependant, cela peut ne pas toujours être vrai car certains caractères peuvent également être écrits en utilisant le code de caractère "codé en dur" ... vous devez donc normaliser d'abord la chaîne UTF8 en forme NFD.

Bien sûr, vous pouvez également transformer n'importe quelle chaîne que vous avez en UTF8, puis revenir dans le jeu de caractères d'origine ... mais la surcharge peut devenir assez importante si vous effectuez des opérations en bloc.

EDIT: Pour répondre spécifiquement à votre question, la meilleure solution est susceptible de normaliser vos chaînes sous forme UTF8 NPD, puis d'ajouter simplement 0x0300 et 0x0301 à votre liste de caractères acceptables, et tout autre combinaison de caractères que vous souhaitez autoriser (comme les points dans åäö, vous pouvez les trouver tous dans "charmap" dans Windows, regardez 0x0300 et "up").

0
Andreas