Eu olhei no Stack Overflow ( substituindo caracteres ... eh , como o JavaScript não segue o padrão Unicode referente ao RegExp etc.) e não encontrei realmente uma resposta concreta para a pergunta:
How can JavaScript match for accented characters (those with diacritical marks)?
Estou forçando um campo em uma interface do usuário para corresponder ao formato: last_name, first_name
(último [espaço de vírgula] primeiro) e quero fornecer suporte para sinais diacríticos, mas evidentemente no JavaScript é um pouco mais difícil do que em outros idiomas / plataformas.
Esta foi a minha versão original, até eu querer adicionar suporte diacrítico:
/^[a-zA-Z]+,\s[a-zA-Z]+$/
Atualmente, estou debatendo um dos três métodos para adicionar suporte, todos os quais testei e trabalho (pelo menos até certo ponto, não sei realmente qual é a "extensão" da segunda abordagem). Aqui estão eles:
Listar explicitamente todos os caracteres acentuados que eu gostaria de aceitar como válidos (coxos e excessivamente complicados):
var accentedCharacters = "àèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ";
// Build the full regex
var regex = "^[a-zA-Z" + accentedCharacters + "]+,\\s[a-zA-Z" + accentedCharacters + "]+$";
// Create a RegExp from the string version
regexCompiled = new RegExp(regex);
// regexCompiled = /^[a-zA-ZàèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ]+,\s[a-zA-ZàèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ]+$/
- Isso corresponde corretamente a um nome / sobrenome com qualquer um dos caracteres acentuados suportados
accentedCharacters
.
Minha outra abordagem foi usar a .
classe de caracteres, para ter uma expressão mais simples:
var regex = /^.+,\s.+$/;
- Isso iria corresponder para praticamente nada, pelo menos na forma de:
something, something
. Tudo bem, suponho ...
A última abordagem, que acabei de descobrir, pode ser mais simples ...
/^[a-zA-Z\u00C0-\u017F]+,\s[a-zA-Z\u00C0-\u017F]+$/
- Ele corresponde a uma variedade de caracteres unicode - testados e funcionando, embora eu não tenha tentado nada louco, apenas as coisas normais que vejo em nosso departamento de idiomas para nomes de membros da faculdade.
Aqui estão as minhas preocupações:
- A primeira solução é muito limitadora e desleixada e complicada. Precisaria ser mudado se eu esquecesse um personagem ou dois, e isso não é muito prático.
- A segunda solução é melhor, concisa, mas provavelmente corresponde muito mais do que realmente deveria. Não consegui encontrar nenhuma documentação real sobre exatamente o que
.
corresponde, apenas a generalização de "qualquer caractere, exceto o caractere de nova linha" (de uma tabela no MDN ). A terceira solução parece ser a mais precisa, mas existem algumas dicas? Eu não sou muito familiarizado com Unicode, pelo menos na prática, mas olhando para um código de mesa / continuação dessa mesa ,
\u00C0-\u017F
parece ser bastante sólido, pelo menos para a minha entrada esperado.- O corpo docente não enviará formulários com seus nomes no idioma nativo (por exemplo, árabe, chinês, japonês etc.), para que eu não precise me preocupar com caracteres fora do conjunto de caracteres latinos
Portanto, a (s) questão (s) real (is) : Qual dessas três abordagens é mais adequada para a tarefa? Ou existem soluções melhores?
.
átomo corresponde a qualquer coisa, exceto as novas linhas ", na verdade, é bem exato :-)
regex = /^[^,]+,\s[^,]+$/;
para evitar isso.