Como combinar caracteres acentuados com um regex?

Eu estou executando Ruby on Rails 3.0.10 e Ruby 1.9.2. Eu estou usando o seguinte Regex para corresponder nomes:

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

No entanto, se eu tentar salvar algumas palavras como as seguintes:

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

Eu tenho um erro de validação "Name format is invalid. .

Como eu posso mudar o Regex acima para que também combine com caracteres acentuados como à , è , é , ì , ò , ù , …?

Em vez de \w , use a expressão de colchete 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"] 

Em seu caso particular, mude o regex para isso:

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

Isso combina muito mais do que apenas caracteres acentuados, no entanto. O que é uma boa coisa. Certifique-se de ler esta input do blog sobre equívocos comuns sobre nomes em aplicativos de software.

Uma solução seria, claro, simplesmente encontrar todos eles apenas usá-los como faria normalmente, embora eu suponha que eles podem ser muitos.

Se você estiver usando o UTF8, descobrirá que esses caracteres geralmente são divididos em duas partes, o caractere “base” em si, seguido do sotaque (0x0300 e 0x0301, creio), também chamado de caractere de combinação. No entanto, isso nem sempre pode ser verdade, pois alguns caracteres também podem ser escritos usando o código de caractere “codificado” … então, é necessário normalizar primeiro a string UTF8 para o formato NFD.

Claro, você também pode transformar qualquer string que você tenha em UTF8 e depois voltar para o conjunto de caracteres original … mas a sobrecarga pode se tornar muito grande se você estiver executando operações em massa.

EDIT: Para responder a sua pergunta especificamente, a melhor solução é normalizar suas seqüências de caracteres em formulário UTF8 NPD e, em seguida, basta adicionar 0x0300 e 0x0301 à sua lista de caracteres aceitáveis ​​e quaisquer outros caracteres combinados que você deseja permitir (como os pontos em åäö, você pode encontrá-los todos em “charmap” no Windows, olhar em 0x0300 e “up”).

Intereting Posts