- Notifications
You must be signed in to change notification settings - Fork111
Sets and ranges [...]#427
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
Open
peruibeloko wants to merge4 commits intojavascript-tutorial:masterChoose a base branch fromperuibeloko:09/08
base:master
Could not load branches
Branch not found:{{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline, and old review comments may become outdated.
Uh oh!
There was an error while loading.Please reload this page.
Open
Changes fromall commits
Commits
File 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
7 changes: 4 additions & 3 deletions...ular-expressions/08-regexp-character-sets-and-ranges/1-find-range-1/solution.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
4 changes: 2 additions & 2 deletions9-regular-expressions/08-regexp-character-sets-and-ranges/1-find-range-1/task.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,5 +1,5 @@ | ||
# Java[^script] | ||
Dada a expressão regular`pattern:/Java[^script]/`, responda: | ||
Ela corresponde com alguma coisa na string `subject:Java`?E na string `subject:JavaScript`? |
6 changes: 3 additions & 3 deletions...pressions/08-regexp-character-sets-and-ranges/2-find-time-2-formats/solution.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,8 +1,8 @@ | ||
Resposta: `pattern:\d\d[-:]\d\d`. | ||
```js run | ||
let regexp = /\d\d[-:]\d\d/g; | ||
alert( "Café da manhã as09:00.Jantar as 21-30".match(regexp) ); // 09:00, 21-30 | ||
``` | ||
Lembre-se que o hífen`pattern:'-'`possui um significado especial entre colchetes, mas apenas quando está entre outros caracteres, não quando está no começo ou no final do conjunto, descartando a necessidade de escapá-lo. |
10 changes: 5 additions & 5 deletions...r-expressions/08-regexp-character-sets-and-ranges/2-find-time-2-formats/task.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,12 +1,12 @@ | ||
#Encontre o horário no formatohh:mmou hh-mm | ||
A string pode estar no formato `horas:minutos` ou `horas-minutos`.Ambas horas e minutos são compostas de 2 dígitos:`09:00`ou `21-30`. | ||
Escreva uma expressão regular que corresponda ao horário: | ||
```js | ||
let regexp = /your regexp/g; | ||
alert( "Café da manhã as09:00.Jantar as 21-30".match(regexp) ); // 09:00, 21-30 | ||
``` | ||
P.S.Assuma para essa tarefa que o horário sempre estará correto, e não é necessário filtrar casos impossíveis, como"45:67".Aprenderemos a lidar com esses casos mais a frente também. |
175 changes: 88 additions & 87 deletions9-regular-expressions/08-regexp-character-sets-and-ranges/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,197 +1,198 @@ | ||
#Conjuntos e alcances [...] | ||
Caracteres ou classes de caracteres dentro de colchetes `[…]`significam "Corresponda com qualquer caractere dentre os fornecidos". | ||
##Conjuntos | ||
O padrão `pattern:[eao]`, por exemplo, corresponde com qualquer um dos 3 caracteres: `'a'`, `'e'`, or `'o'`. | ||
Isso é chamado de *conjunto*.Conjuntos podem ser usados numa regex como qualquer outro caractere normal: | ||
```js run | ||
//Case [tou m],e então "op" | ||
alert( "Mop top".match(/[tm]op/gi) ); // "Mop", "top" | ||
``` | ||
Repare que mesmo que um conjunto possua múltiplos caracteres, ele corresponde a apenas um caractere por vez. | ||
Dessa maneira, o exemplo abaixo não corresponde com nada: | ||
```js run | ||
//Case com"V",depois [oou i],e então "la" | ||
alert( "Voila".match(/V[oi]la/) ); // null,nenhuma correspondência | ||
``` | ||
O padrão está procurando por: | ||
- `pattern:V`, | ||
-seguido de apenas *uma* das letras `pattern:[oi]`, | ||
-seguido de `pattern:la`. | ||
Então encontraríamos`match:Vola`ou `match:Vila`. | ||
##Alcances | ||
Colchetes também podem conter *alcances de caracteres*. | ||
Por exemplo, `pattern:[a-z]`é qualquer caractere entre`a`e `z`,e `pattern:[0-5]`é qualquer dígito entre `0`e `5`. | ||
No exemplo abaixo estamos buscado por um `"x"`seguido de dois dígitos ou letras de `A`a `F`: | ||
```js run | ||
alert( "Exception 0xAF".match(/x[0-9A-F][0-9A-F]/g) ); // xAF | ||
``` | ||
O padrão`pattern:[0-9A-F]`tem dois alcances: Ele corresponde com dígitos de`0`a `9`ou uma letra de `A`a `F`. | ||
Se quisermos encontrar letras minúsculas também, podemos adicionar o alcance`a-f` (`pattern:[0-9A-Fa-f]`), ou adicionar a opção `pattern:i`. | ||
Também podemos usar classes de caracteres dentro do `[…]`. | ||
Se quisermos, por exemplo, buscar por um caractere "de palavra"`pattern:\w`ou um hífen `pattern:-`,o conjunto fica`pattern:[\w-]` | ||
Também é possível combinar várias classes; o padrão`pattern:[\s\d]`, por exemplo, significa "um caractere de espaço ou um dígito". | ||
```smart header="Classes de caracteres são atalhos para certos conjuntos de caracteres" | ||
Por exemplo: | ||
- **\d** --é o mesmo padrão que `pattern:[0-9]`, | ||
- **\w** --é o mesmo padrão que `pattern:[a-zA-Z0-9_]`, | ||
- **\s** --é o mesmo padrão que`pattern:[\t\n\v\f\r ]`,com a adição de mais alguns caracteresUnicodede espaço raros. | ||
``` | ||
###Exemplo: \w multilinguagens | ||
Como a classe de caracteres`pattern:\w`é um atalho para `pattern:[a-zA-Z0-9_]`,ele não reconhece ideogramas, letras cirílicas, etc. | ||
Nós podemos escrever um padrão mais universal, que encontra caracteres usados em palavras de qualquer língua. Fica fácil usando propriedades Unicode: `pattern:[\p{Alpha}\p{M}\p{Nd}\p{Pc}\p{Join_C}]`. | ||
Vamos decifrar o padrão. Similarmente ao `pattern:\w`,estamos criando nosso próprio conjunto que inclui caracteres com as seguintes propriedades Unicode: | ||
- `Alphabetic` (`Alpha`) -para letras, | ||
- `Mark` (`M`) -para acentos, | ||
- `Decimal_Number` (`Nd`) -para dígitos, | ||
- `Connector_Punctuation` (`Pc`) -para o *underscore* `'_'`e caracteres similares, | ||
- `Join_Control` (`Join_C`) -para dois códigos especiais,`200c`e `200d`,usados em ligaturas Árabes, por exemplo. | ||
Vejamos um caso de uso: | ||
```js run | ||
let regexp = /[\p{Alpha}\p{M}\p{Nd}\p{Pc}\p{Join_C}]/gu; | ||
let str = `Hi 你好 12`; | ||
//Encontra todas as letras e dígitos: | ||
alert( str.match(regexp) ); // H,i,你,好,1,2 | ||
``` | ||
E claro, podemos mudar esse padrão adicionando ou removendo propriedades Unicode. PropriedadesUnicodesão discutidas em maior profundidade no artigo <info:regexp-unicode>. | ||
```warn header="PropriedadesUnicodenão são suportadas no IE" | ||
PropriedadesUnicode `pattern:p{…}`não são implementadas no Internet Explorer. Se for realmente necessário dar suporte ao navegador, pode-se usar uma biblioteca como a [XRegExp](https://xregexp.com/). | ||
Outra opção é utilizar alcances de caracteres da língua relevante, como`pattern:[а-я]`para o alfabeto cirílico, por exemplo. | ||
``` | ||
##Alcances negados | ||
Além dos alcances normais, existem os alcances negados que usam a sintaxe `pattern:[^…]`. | ||
Eles são demarcados pelo acento circunflexo`^`no começo e correspondem a qualquer caractere *exceto os incluídos no alcance* | ||
Por exemplo: | ||
- `pattern:[^aeyo]` --reconhece qualquer caractere exceto`'a'`, `'e'`, `'y'`e `'o'`. | ||
- `pattern:[^0-9]` --reconhece qualquer caractere exceto um dígito, equivalente ao `pattern:\D`. | ||
- `pattern:[^\s]` --reconhece qualquer caractere que não seja um espaço em branco, equivalente ao `\S`. | ||
O exemplo abaixo busca por qualquer caractere que não seja uma letra, um dígito ou um espaço: | ||
```js run | ||
alert( "alice15@gmail.com".match(/[^\d\sA-Z]/gi) ); // @e . | ||
``` | ||
##Escapes dentro do […] | ||
Normalmente quando queremos encontrar um caractere especial precisamos escapá-lo com a contrabarra`pattern:\.`.Se precisamos buscar uma contrabarra, escapamos ela também (`pattern:\\`), e assim por diante | ||
Dentro de colchetes podemos usar a grande maioria de caracteres especiais sem nenhum escape: | ||
-Os símbolos`pattern:. + ( )`nunca precisam de escape. | ||
-Um hífen `pattern:-`não precisa ser escapado se estiver no começo ou no final do conjunto(onde ele nãodefinenenhum alcance). | ||
-O acento circunflexo`pattern:^`só precisa ser escapado caso seja o primeiro elemento do conjunto (onde ele sinaliza a negação do conjunto). | ||
-O colchete direito`pattern:]`sempre deve ser escapado (caso precisemos buscar por ele). | ||
Em outras palavras, todos os caracteres especiais podem ser usados sem escapes, exceto nos casos onde eles modificam o comportamento do conjunto em si. | ||
O ponto `.`dentro de um conjunto representa um ponto literal. O padrão `pattern:[.,]`reconhece um ponto ou uma vírgula. | ||
No exemplo abaixo, a expressão`pattern:[-().^+]`reconhece qualquer um dos caracteres `-().^+`: | ||
```js run | ||
//Não é necessário escapar nada | ||
let regexp = /[-().^+]/g; | ||
alert( "1 + 2 - 3".match(regexp) ); //Encontra + e - | ||
``` | ||
...Mas caso você queira escapar "só para garantir",o efeito é o mesmo: | ||
```js run | ||
//Tudo escapado | ||
let regexp = /[\-\(\)\.\^\+]/g; | ||
alert( "1 + 2 - 3".match(regexp) ); //Também encontra + e - | ||
``` | ||
##Alcances e a opção "u" | ||
Se existem pares substitutos no conjunto, a opção`pattern:u`é obrigatória para garantir seu funcionamento correto. | ||
No exemplo abaixo queremos realizar uma busca pelo padrão`pattern:[𝒳𝒴]`na string `subject:𝒳`: | ||
```js run | ||
alert( '𝒳'.match(/[𝒳𝒴]/) ); //Mostra um caractere estranho, como um [?] | ||
// (A pesquisa não teve sucesso, retornamos apenas metade de um caractere) | ||
``` | ||
O resultado está errado, já que a a expressão regular "não enxerga" o par substituto. | ||
O interpretador de expressões regulares pensa que o conjunto `[𝒳𝒴]` contém quatro caracteres, não dois: | ||
1. Metade esquerda do `𝒳` `(1)`, | ||
2. Metade direita do `𝒳` `(2)`, | ||
3. Metade esquerda do `𝒴` `(3)`, | ||
4. Metade direita do `𝒴` `(4)`. | ||
Podemos ler seus códigos dessa maneira: | ||
```js run | ||
for(let i=0; i<'𝒳𝒴'.length; i++) { | ||
alert('𝒳𝒴'.charCodeAt(i)); // 55349, 56499, 55349, 56500 | ||
}; | ||
``` | ||
Por conta disso, o exemplo acima reconhece apenas a metade esquerda do `𝒳`. | ||
Agora, se adicionarmos a opção`pattern:u`,o comportamento é o esperado: | ||
```js run | ||
alert( '𝒳'.match(/[𝒳𝒴]/u) ); // 𝒳 | ||
``` | ||
Uma situação parecida acontece quando estamos buscando por um alcance, como `[𝒳-𝒴]`. | ||
Se não usarmos a opção`pattern:u`,um erro ocorre: | ||
```js run | ||
'𝒳'.match(/[𝒳-𝒴]/); // Error: Invalid regular expression (Expressão regular inválida) | ||
``` | ||
Isso ocorre porque sem a opção `pattern:u`, pares substitutos são percebidos como dois caracteres separados, então o alcance`[𝒳-𝒴]`é interpretado como `[<55349><56499>-<55349><56500>]` (cada par substituto é substituído pelos seus códigos constituintes).Dessa forma é fácil perceber que o alcance `56499-55349`é inválido: Seu código inicial `56499`é maior que seu código final,`55349`, causando o erro. | ||
Com a opção `pattern:u`, entretanto, o padrão funciona como esperado: | ||
```js run | ||
//Case com caracteres entre 𝒳e 𝒵 | ||
alert( '𝒴'.match(/[𝒳-𝒵]/u) ); // 𝒴 | ||
``` |
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.