Qual é a maneira mais fácil de corresponder caracteres não ASCII em uma regex? Gostaria de combinar todas as palavras individualmente em uma sequência de entrada, mas o idioma pode não ser o inglês, portanto, precisarei combinar coisas como ü, ö, ß e ñ. Além disso, isso está em Javascript / jQuery, portanto, qualquer solução precisará ser aplicada a isso.
javascript
jquery
regex
Paul Wicks
fonte
fonte
all words
faz parecer que você quer apenas letras que não sejam em inglês e nem todos os caracteres que não sejam em inglês, conforme o título da pergunta.Respostas:
Isso deve servir:
Corresponde a qualquer caractere que não esteja contido no conjunto de caracteres ASCII (0-127, ou seja, 0x0 a 0x7F).
Você pode fazer o mesmo com o Unicode:
Para unicode, você pode ver estes 2 recursos:
fonte
[\u00BF-\u1FFF\u2C00-\uD7FF\w]
como uma carta.[\u00C0-\u1FFF\u2C00-\uD7FF\w]
(sem ponto de interrogação invertido¿
), quanto aos intervalos, consulte BMP .00C0
estáÀ
no suplemento Latin-1 ,1FFF
é o último caractere do grego Extended,2C00
é a primeira letra em Glagolitic eD7FF
é o último caractere em Hangul Jamo Extended-B. Então é tudo, exceto: símbolos e caracteres especiais nos 2 primeiros blocos; símbolos em blocos do meio; substitutos, área privada e caracteres especiais em blocos finais.Este regex corresponderá a todas as palavras no texto de qualquer idioma ...
fonte
[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]
A situação com regexes, Unicode e Javascript é uma porcaria. É ridículo que os programadores precisem confiar em bibliotecas externas para reconhecer que "Αλφα" é uma palavra ou mesmo que "é" é uma letra.
Mas assim vai.
Esse cara escreveu uma boa biblioteca para lidar com Unicode em Javascript Regexes:
http://blog.stevenlevithan.com/archives/javascript-regex-and-unicode
O material Unicode é um plug-in para esta biblioteca de expressões regulares:
http://xregexp.com/
Aqui está um post sobre a extensão Unicode:
http://blog.stevenlevithan.com/archives/xregexp-unicode-plugin
E a própria página de extensão:
http://xregexp.com/plugins/
Ótimo trabalho, mas ainda me incomoda que o Javascript esteja tão atrasado nesse aspecto.
(Ele escreveu um livro para O'Reilly sobre o assunto, por isso é bem possível que ele saiba do que está falando.)
A maneira como ele implementou é adicionando tabelas de caracteres com certas propriedades. Então, quando você constrói um regex com a biblioteca dele,
\p{charclass}
é substituído por[allthecharactersintheclass]
.fonte
Escapes de propriedade Unicode estão entre os recursos do ES2018.
Uso básico
Com os Escapes de propriedade Unicode, você pode combinar uma letra de qualquer idioma com a seguinte expressão regular simples:
Ou com a abreviação, ainda mais terser:
Palavras correspondentes
Em relação caso da questão de utilização concreto (palavras correspondentes), nota que você pode usar Unicode Propriedade Escapes em classes de personagens, tornando-o fácil de combinar letras em conjunto com outras palavras-personagens como hífens:
Reunindo tudo, você pode combinar palavras de todos os [1] idiomas com este RegEx lindamente curto:
Exemplo (vergonhosamente conectado a partir da resposta acima ):
Suporte do navegador
A partir de agora (dezembro de 2018), eu só podia testar esse regex com êxito no Chrome (e em outros navegadores baseados em Blink, como Opera, Vivaldi ou versões futuras do Microsoft Edge) e Safari (a partir da versão 12, testes anteriores com a versão 11 falhou). No entanto, como a especificação está concluída e o recurso é padronizado, espere que outros navegadores modernos sigam em breve.
Criei um pequeno site para você verificar se o seu navegador suporta Escapes de Propriedade Unicode.
Transpiling
As fugas de propriedade Unicode podem ser transpiladas para o ES5 com uma ferramenta chamada regexpu . Há uma demonstração online disponível aqui . Como você pode ver na demonstração, na verdade você pode combinar letras não-latinas hoje com a seguinte expressão regular (horrivelmente longa) do ES5:
Se você estiver usando o Babel, também há um plug-in para regexpu (plug-in Babel v6 , plug-in Babel v7 ).
fonte
u
sinalizador foi introduzido no ES2015 e permite vários recursos relacionados ao Unicode (por exemplo, as fugas de propriedade mencionadas na minha resposta, mesmo que tenham sido introduzidas apenas alguns anos depois). Como os recursos relacionados ao Unicode alteram ligeiramente a semântica de alguns padrões de regex, isso deve ser explicitamente ativado - adicionando esseu
sinalizador.A resposta dada por Jeremy Ruten é ótima, mas acho que não é exatamente o que Paul Wicks estava procurando. Se eu entendi direito, Paul perguntou sobre expressão para combinar com palavras que não sejam o inglês, como
können
oumóc
. A regex de Jeremy corresponde apenas às letras que não estão em inglês; portanto, é necessário um pequeno aprimoramento:ou
Esta
[^\x00-\x7F]
e esta[^\u0000-\u007F]
parte permitem que a expressão regular corresponda a letras não inglesas.Isso
(|)
é lógico ou\w
é uma letra em inglês e, portanto([^\u0000-\u007F]|\w)
, corresponderá a uma única letra em inglês ou não em inglês.+
no final da expressão significa que ela pode ser repetida; portanto, toda a expressão permite que todas as letras em inglês ou não em inglês correspondam.Aqui você pode testar a primeira expressão com várias cadeias e aqui está a segunda.
fonte
Você faz o mesmo que qualquer outro caractere correspondente, mas usa \ uXXXX onde XXXX é o número unicode do caractere.
Veja: http://unicode.org/charts/charindex.html
http://unicode.org/charts/
http://www.decodeunicode.org/
fonte
Todos os tipos de Regex habilitados para Unicode devem ter uma classe de caracteres especial como \ w que corresponda a qualquer letra Unicode. Dê uma olhada no seu sabor específico aqui .
fonte
Eu tive um problema com \ p funcionando como esperado, então apenas usei uma estratégia diferente como:
Encontre qualquer coisa que não seja um caractere de tabulação até o próximo caractere de tabulação ... obviamente isso depende da sua fonte de pesquisa, mas você entendeu. Agora não tenho que descobrir quais caracteres unicode funcionam e não funcionam etc.
fonte