- Notifications
You must be signed in to change notification settings - Fork111
Unicode: flag "u" and class \p{...}#415
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Merged
Uh oh!
There was an error while loading.Please reload this page.
Merged
Changes fromall commits
Commits
Show all changes
8 commits Select commitHold shift + click to select a range
7fd4348
progress article translation
peruibeloko735e508
remove redundancy
peruibelokoabd56e5
finish article translation
peruibeloko60a13e3
fix minor issues
peruibeloko5242070
fix: use pt-BR translation of character
peruibeloko64c8b50
better translation for surrogate pairs
peruibeloko8de2fbd
update minor changes
peruibelokobabcd73
minor tweaks
peruibelokoFile filter
Filter by extension
Conversations
Failed to load comments.
Loading
Uh oh!
There was an error while loading.Please reload this page.
Jump to
Jump to file
Failed to load files.
Loading
Uh oh!
There was an error while loading.Please reload this page.
Diff view
Diff view
There are no files selected for viewing
208 changes: 104 additions & 104 deletions9-regular-expressions/03-regexp-unicode/article.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,161 +1,161 @@ | ||
# Unicode: flag "u"e classe \p{...} | ||
OJavaScriptusa a [codificação Unicode](https://pt.wikipedia.org/wiki/Unicode)para strings.A maioria dos caracteres são codificados com2 bytes,mas isso permite representar no máximo65536caracteres diferentes. | ||
Esse alcance não é grande o bastante para codificar todos os caracteres possíveis, por isso alguns caracteres são codificados com4 bytes,como o`𝒳` (X matemático) ou o`😄` (emoji sorridente),alguns ideogramas e assim por diante. | ||
Aqui estão os códigosUnicodede alguns caracteres: | ||
|Carácter| Unicode | Tamanho em bytes do caractere em Unicode | | ||
|-------- |--------- |----------------------------------------| | ||
| a| `0x0061` | 2 | | ||
| ≈| `0x2248` | 2 | | ||
| 𝒳| `0x1d4b3` | 4 | | ||
| 𝒴| `0x1d4b4` | 4 | | ||
| 😄| `0x1f604` | 4 | | ||
Note que caracteres como`a`e `≈`ocupam 2 bytes,enquanto os códigos para`𝒳`, `𝒴`e `😄`são maiores, e ocupam 4 bytes. | ||
Há muito tempo atrás, quando oJavaScriptfoi criado, a codificaçãoUnicodeera mais simples: não haviam caracteres de 4 bytes. Então, algumas funcionalidades da linguagem ainda lidam com estes incorretamente. | ||
Por exemplo, o método`length`pensa que aqui há dois caracteres: | ||
```js run | ||
alert("😄".length); // 2 | ||
alert("𝒳".length); // 2 | ||
``` | ||
...Mas nós podemos ver que há apenas um, certo? O ponto é que o método`length`trata 4 bytescomo dois caracteres de 2 bytes. Isso está errado, porque eles devem ser somente considerados juntos (os chamados "pares substitutos",você pode ler mais sobre eles no artigo <info:string>). | ||
Por padrão, expressões regulares também tratam "caracteres compridos" de 4 bytes como um par de caracteres de 2 bytes. E, da mesma maneira que acontece comstrings,isso pode levar a resultados estranhos. Veremos isso mais adiante, no artigo <info:regexp-character-sets-and-ranges>. | ||
Diferente destrings,expressões regulares têm aflag `pattern:u`que resolve tais problemas. com essa flag,uma regexplida com caracteres de 4 bytes corretamente. Busca por propriedades doUnicodetambém se torna disponível, abordaremos o assunto a seguir. | ||
##Propriedades Unicode \p{...} | ||
Cada caractere no Unicodetem diversas propriedades. Elas descrevem a "categoria" a qual o caractere pertence, e contém informações miscelâneas sobre ele. | ||
Por exemplo, se um caractere possui a propriedade`Letter`, isso significa que o caractere pertence a um alfabeto (de qualquer língua).A propriedade`Number`indica que é um dígito: talvez Árabe ou Chinês, e assim por diante. | ||
Podemos buscar por caracteres baseado em suas propriedades, escrito como `pattern:\p{…}`.Para usar o`pattern:\p{…}`, aexpressãoregulardeve possuir a flag `pattern:u`. | ||
Por exemplo, `\p{Letter}`denota uma letra em qualquer língua. Também podemos usar`\p{L}`,já que`L`é um apelido (do Inglês: _alias_) de`Letter`.Existem apelidos curtos para quase todas as propriedades. | ||
No exemplo abaixo três tipos de letras serão encontrados: Inglês, Georgiano e Coreano. | ||
```js run | ||
let str = "A ბ ㄱ"; | ||
alert(str.match(/\p{L}/gu)); // A,ბ,ㄱ | ||
alert(str.match(/\p{L}/g)); // null (nenhuma correspondência, \pnão funciona sem a flag "u") | ||
``` | ||
Estas são as principais categorias de caracteres e suas sub-categorias: | ||
-Letra (Letter) `L`: | ||
-minúscula `Ll` | ||
-modificadora `Lm`, | ||
-titular `Lt`, | ||
-maiúscula `Lu`, | ||
-outra `Lo`. | ||
-Número (Number) `N`: | ||
-dígito decimal `Nd`, | ||
-letras numéricas `Nl`, | ||
-outro `No`. | ||
-Pontuação (Punctuation) `P`: | ||
-conector `Pc`, | ||
-traço `Pd`, | ||
-aspas esquerdas `Pi`, | ||
-aspas direitas `Pf`, | ||
-abertura `Ps`, | ||
-fechamento `Pe`, | ||
-outro `Po`. | ||
-Marcações Diacríticas (Mark) `M`: | ||
-com espaço `Mc`, | ||
-envolvente `Me`, | ||
-sem espaço `Mn`. | ||
-Símbolos (Symbol) `S`: | ||
-moeda `Sc`, | ||
-modificador `Sk`, | ||
-matemático `Sm`, | ||
-outro `So`. | ||
-Separadores (Separator) `Z`: | ||
-linha `Zl`, | ||
-parágrafo `Zp`, | ||
-espaço `Zs`. | ||
-Outros (Other) `C`: | ||
-controle `Cc`, | ||
-formato `Cf`, | ||
-não atribuído `Cn`, | ||
-uso reservado `Co`, | ||
-substituto `Cs`. | ||
Então, se precisarmos de letras minúsculas por exemplo, podemos escrever `pattern:\p{Ll}`, símbolos de pontuação: `pattern:\p{P}` e assim por diante. | ||
Existem outras categorias derivadas, como: | ||
- `Alphabetic` (`Alpha`),inclui a categoria "Letters" `L`,e letras numéricas `Nl` (Exemplo: Ⅻ -Um caractere para o número romano 12),além de alguns outros símbolos `Other_Alphabetic` (`OAlpha`). | ||
- `Hex_Digit`inclui dígitos hexadecimais: `0-9`, `a-f`. | ||
- ...E assim por diante. | ||
OUnicodesuporta muitas propriedades diferentes, e a lista completa precisaria de muito espaço, então aqui estão as referências: | ||
-Lista de todas as propriedades por caractere: <https://unicode.org/cldr/utility/character.jsp>. | ||
-Lista de todos os caracteres por propriedade: <https://unicode.org/cldr/utility/list-unicodeset.jsp>. | ||
-Apelidos curtos das propriedades: <https://www.unicode.org/Public/UCD/latest/ucd/PropertyValueAliases.txt>. | ||
- A basecompleta dos caracteres Unicode em formato textual, com todas as suas propriedades, está aqui: <https://www.unicode.org/Public/UCD/latest/ucd/>. | ||
###Exemplo: Números hexadecimais | ||
Para este exemplo, vamos procurar por números hexadecimais, escritos como `xFF`,onde `F`é um dígito hexadecimal (0..9ou A..F). | ||
Um dígito hexadecimal pode ser indicado por `pattern:\p{Hex_Digit}`: | ||
```js run | ||
let regexp = /x\p{Hex_Digit}\p{Hex_Digit}/u; | ||
alert("number: xAF".match(regexp)); // xAF | ||
``` | ||
###Exemplo: Sinogramas Chineses | ||
Vamos procurar por sinogramas chineses. | ||
Há uma propriedadeUnicodechamada `Script` (sistema de escrita),que pode receber diferentes valores: `Cyrillic` (Cirílico: Russo, Ucraniano, Sérvio),`Greek` (Grego), `Arabic` (Árabe), `Han` (Chinês) e assim por diante, [a lista completa pode ser encontrada aqui](<https://en.wikipedia.org/wiki/Script_(Unicode)>). | ||
Para procurar por caracteres de um sistema de escrita específico nós devemos usar o`pattern:Script=<value>`. Para buscar letras cirílicas, por exemplo: `pattern:\p{sc=Cyrillic}`,para sinogramas chineses: `pattern:\p{sc=Han}`,e assim por diante: | ||
```js run | ||
let regexp = /\p{sc=Han}/gu; //retorna sinogramas chineses | ||
let str = `Hello Привет 你好 123_456`; | ||
alert(str.match(regexp)); // 你,好 | ||
``` | ||
###Exemplo: Moeda | ||
Caracteres que representam uma moeda, como`$`, `€`, `¥`,possuem a propriedade Unicode `pattern:\p{Currency_Symbol}`,de apelido: `pattern:\p{Sc}`. | ||
Vamos usá-la para procurar por preços no formato "símbolo de moeda, seguido de um dígito": | ||
```js run | ||
let regexp = /\p{Sc}\d/gu; | ||
let str = `Prices: $2, €1, ¥9`; | ||
alert(str.match(regexp)); // $2,€1,¥9 | ||
``` | ||
Mais adiante, no artigo<info:regexp-quantifiers>veremos como procurar por números que contém vários dígitos. | ||
##Sumário | ||
A flag`pattern:u`ativa o suporte ao Unicodeem expressões regulares. | ||
Isso resulta em duas coisas: | ||
1.Caracteres de 4 bytessão reconhecidos corretamente: como um único caractere, não dois caracteres de 2 bytes. | ||
2.PropriedadesUnicodepodem ser usadas na busca, usando `\p{…}`. | ||
Com as propriedades Unicode podemos buscar por palavras em línguas específicas, caracteres especiais (aspas, símbolos de moeda) e assim por diante. |
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.