Skip to content

Methods of RegExp and String #141

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 our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 42 commits into from
May 1, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
a668310
Translation to portuguese done. Source file can be found: https://git…
fsdude May 24, 2020
f7e7f38
Removed files that aren't used anymore on english version
fsdude May 25, 2020
a906139
Translated english article to portuguese following the english version
fsdude May 25, 2020
60a9345
reuploaded the svg file quoted on article (other one was broken)
fsdude May 25, 2020
93a763d
Resolve conflicts.
odsantos Dec 24, 2020
41188c4
Merge branch 'fsdude-02-regexp-character-classes' into master
odsantos Dec 24, 2020
2f7d7ed
Merge branch '02-regexp-character-classes' of https://github.com/fsdu…
odsantos Dec 24, 2020
e9c30ce
Merge branch 'fsdude-02-regexp-character-classes' into master
odsantos Dec 24, 2020
0faf9be
Delete old directory.
odsantos Dec 24, 2020
df62d2c
Merge branch 'fsdude-02-regexp-character-classes' into master
odsantos Dec 24, 2020
e15db78
Merge branch '17-regexp-methods' of https://github.com/fsdude/pt.java…
odsantos Dec 24, 2020
5302f46
Merge branch 'fsdude-17-regexp-methods' into master
odsantos Dec 24, 2020
0661b81
Revert "Merge branch 'fsdude-02-regexp-character-classes' into master"
odsantos Dec 25, 2020
bfab762
Revert "Merge branch 'fsdude-02-regexp-character-classes' into master"
odsantos Dec 25, 2020
38aa681
Revert "Merge branch 'fsdude-02-regexp-character-classes' into master"
odsantos Dec 25, 2020
cdade39
Revert "Revert "Merge branch 'fsdude-02-regexp-character-classes' int…
odsantos Dec 25, 2020
30fcc30
Revert "Revert "Revert "Merge branch 'fsdude-02-regexp-character-clas…
odsantos Dec 25, 2020
72e1fa8
Revert "Revert "Revert "Revert "Merge branch 'fsdude-02-regexp-charac…
odsantos Dec 25, 2020
08e5000
Revert "Revert "Revert "Revert "Revert "Merge branch 'fsdude-02-regex…
odsantos Dec 25, 2020
082dff2
Revert "Revert "Revert "Revert "Merge branch 'fsdude-02-regexp-charac…
odsantos Dec 25, 2020
f86d836
Revert "Merge branch 'fsdude-02-regexp-character-classes' into master"
odsantos Dec 25, 2020
72ffd48
Revert "Merge branch 'fsdude-02-regexp-character-classes' into master"
odsantos Dec 25, 2020
24b8013
Revert "Merge branch 'fsdude-02-regexp-character-classes' into master"
odsantos Dec 25, 2020
43eec8e
Replace 'en' version by translation.
odsantos Dec 25, 2020
a5063b3
Remove unrelated files.
odsantos Dec 25, 2020
dec19b6
Merge branch '17-regexp-methods' of https://github.com/fsdude/pt.java…
odsantos Dec 25, 2020
0f1f4fb
Remove unrelated file from PR.
odsantos Dec 25, 2020
20ef46b
Merge branch 'master' into 17-regexp-methods
odsantos Jan 14, 2021
ce1dc38
Update 9-regular-expressions/17-regexp-methods/article.md
odsantos Jul 13, 2021
91b0eb8
Update 9-regular-expressions/17-regexp-methods/article.md
odsantos Jul 13, 2021
bc67b57
Update 9-regular-expressions/17-regexp-methods/article.md
odsantos Jul 13, 2021
1896a39
Update 9-regular-expressions/17-regexp-methods/article.md
odsantos Jul 13, 2021
bb60e9b
Update 9-regular-expressions/17-regexp-methods/article.md
odsantos Jul 13, 2021
2cbea56
Update 9-regular-expressions/17-regexp-methods/article.md
odsantos Jul 13, 2021
310f8c9
Update 9-regular-expressions/17-regexp-methods/article.md
odsantos Jul 13, 2021
1f0e33c
Update 9-regular-expressions/17-regexp-methods/article.md
odsantos Jul 13, 2021
71f5b50
Update 9-regular-expressions/17-regexp-methods/article.md
odsantos Jul 13, 2021
7b33685
Update 9-regular-expressions/17-regexp-methods/article.md
odsantos Jul 13, 2021
2a9b2e8
Merge branch 'master' into 17-regexp-methods
odsantos Jul 13, 2021
04f88aa
Merge branch 'master' of https://github.com/javascript-tutorial/pt.ja…
jonnathan-ls Apr 28, 2024
3565c17
refactor: fixes merge conflicts, translates pending content and appli…
jonnathan-ls Apr 28, 2024
ab578b0
refactor: fixes syntax spelling error
jonnathan-ls Apr 28, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Revert "Merge branch 'fsdude-02-regexp-character-classes' into master"
This reverts commit df62d2c, reversing
changes made to e9c30ce.
  • Loading branch information
odsantos committed Dec 25, 2020
commit f86d836a1d015861b82207febd4db8f02ed6a2b4
203 changes: 203 additions & 0 deletions 9-regular-expressions/03-regexp-character-classes/article.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,203 @@
# Classes de caracteres

Considere uma tarefa prática - temos um número de telefone como `"+7(903)-123-45-67"` e precisamos transformá-lo em números puros: `79031234567`.

Para fazer isso, podemos encontrar e remover qualquer coisa que não seja um número. Classes de personagens podem ajudar com isso.

Uma *classe de caracteres* é uma notação especial que corresponde a qualquer símbolo de um determinado conjunto.

Para começar, vamos explorar a classe "digit". Está escrito como `padrão: \d` e corresponde a "qualquer dígito único".

Por exemplo, vamos encontrar o primeiro dígito no número de telefone:

```js run
let str = "+7(903)-123-45-67";

let regexp = /\d/;

alert( str.match(regexp) ); // 7
```

Sem a flag `padrão:g`, a expressão regular procura apenas a primeira correspondência, que é o primeiro dígito `padrão:\d`.

Vamos adicionar a flag `padrão:g` para encontrar todos os dígitos:

```js run
let str = "+7(903)-123-45-67";

let regexp = /\d/g;

alert( str.match(regexp) ); // matriz de correspondências: 7,9,0,3,1,2,3,4,5,6,7

// vamos criar o número de telefone apenas com dígitos:
alert( str.match(regexp).join('') ); // 79031234567
```

Essa era uma classe de caracteres para dígitos. Existem outras classes de caracteres também.

As mais usadas são:

`padrão:\d` ("d" é de "digit")
: Um dígito: um caractere de `0` a `9`.

`padrão:\s` ("s" é de "space")
: Um símbolo de espaço: inclui espaços, tabulações `\t`, novas linhas `\n` e alguns outros caracteres raros, como `\v`, `\f` and `\r`.

`padrão:\w` ("w" é de "word")
: Um caractere de texto: uma letra do alfabeto latino ou um dígito ou um sublinhado `_`. Letras não latinas (como cirílico ou hindu) não pertecem ao `padrão:\w`.

Por exemplo, `padrão:\d\s\w` significa um "dígito" seguido de um "caractere de espaço" seguido de um "caractere de texto", como `correspondência:1 a`.

**Uma regexp pode conter símbolos regulares e classes de caracteres.**

Por exemplo, `padrão:CSS\d` corresponde a uma string `correspondência:CSS` com um dígito após:

```js run
let str = "Existe CSS4?";
let regexp = /CSS\d/

alert( str.match(regexp) ); // CSS4
```

Também podemos usar muitas classes de caracteres:

```js run
alert( "Eu amo HTML5!".match(/\s\w\w\w\w\d/) ); // ' HTML5'
```

A correspondência (cada classe de caracteres regexp possui o caractere de resultado correspondente):

![](love-html5-classes.svg)

## Classes inversas

Para cada classe de caractere existe uma "classe inversa", denotada com a mesma letra, mas em maiúsculas.

O "inverso" significa que ele corresponde a todos os outros caracteres, por exemplo:

`padrão:\D`
: Sem dígito: qualquer caractere, exceto `padrão:\d`, por exemplo, uma letra.

`padrão:\S`
: Sem espaço: qualquer caractere, exceto `padrão:\s`, por exemplo, uma letra.

`padrão:\W`
: Caractere não verbal: qualquer coisa, exceto `padrão:\w`, por exemploo uma letra não latina ou um espaço.

No início do capítulo, vimos como criar um número de telefone somente para números a partir de uma string como `subject:+7(903)-123-45-67`: encontre todos os dígitos e junte-se a eles.

```js run
let str = "+7(903)-123-45-67";

alert( str.match(/\d/g).join('') ); // 79031234567
```

Uma maneira alternativa e mais curta é encontrar um `padrão:\D` não-dígito e removê-lo da string:

```js run
let str = "+7(903)-123-45-67";

alert( str.replace(/\D/g, "") ); // 79031234567
```

## Um ponto é "qualquer caractere"

Um ponto `padrão:.` é uma classe de caractere especial que corresponde a "qualquer caractere, exceto uma nova linha".

Por exemplo:

```js run
alert( "Z".match(/./) ); // Z
```

Ou no meio de uma regexp:

```js run
let regexp = /CS.4/;

alert( "CSS4".match(regexp) ); // CSS4
alert( "CS-4".match(regexp) ); // CS-4
alert( "CS 4".match(regexp) ); // CS 4 (o espaço é também um caractere)
```

Observe que um ponto significa "qualquer caractere", mas não a "ausência de um caractere". Deve haver um caractere para corresponder a ele:

```js run
alert( "CS4".match(/CS.4/) ); // null, sem correspondência porque não há caractere para o ponto
```

### Ponto como literalmente qualquer caractere com a flag "s"

Por padrão, um ponto não corresponde ao caractere de nova linha `\n`.

Por exemplo, a regexp `padrão:A.B` corresponde `corresponde:A` e, em seguida, `corresponde:B` com qualquer caractere entre eles, exceto uma nova linha `\n`:

```js run
alert( "A\nB".match(/A.B/) ); // null (sem correspondência)
```

Há muitas situações em que gostaríamos que um ponto significasse literalmente "qualquer caractere", incluindo a nova linha.

É o que flag `padrão:s` faz. Se uma regexp possui, então um ponto `padrão:.` corresponde literalmente a qualquer caractere:

```js run
alert( "A\nB".match(/A.B/s) ); // A\nB (correspondência!)
```

````warn header="Não suportado no Firefox, IE, Edge"
Verifique <https://caniuse.com/#search=dotall> para obter o estado de suporte mais recente. No momento da redação deste documento, não inclui o Firefox, IE, Edge.

Felizmente, há uma alternativa, que funciona em qualquer lugar. Podemos usar uma regexp como `padrão:[\s\S]` para corresponder a "qualquer caractere".

```js run
alert( "A\nB".match(/A[\s\S]B/) ); // A\nB (match!)
```

O padrão `padrão:[\s\S]` diz literalmente: "um caractere de espaço OU não um caractere de espaço". Em outras palavras, "qualquer coisa". Poderíamos usar outro par de classes complementares, como `padrão:[\d\D]`, que não importa. Ou mesmo o padrão `padrão:[^]` - pois significa corresponder a qualquer caractere, exceto nada.

Também podemos usar esse truque se quisermos os dois tipos de "pontos" no mesmo padrão: o ponto real `padrão:.` comportando-se da maneira regular ("não incluindo uma nova linha") e também uma maneira de combinar "qualquer caractere" com `padrão:[\s\S]` ou similar.
````

````warn header="Preste atenção nos espaços"
Geralmente prestamos pouca atenção aos espaços. Para nós, as strings `sujeito:1-5` e `sujeito:1 - 5` são quase idênticas.

Mas se uma regexp não leva em consideração os espaços, ela pode falhar.

Vamos tentar encontrar dígitos separados por um hífen:

```js run
alert( "1 - 5".match(/\d-\d/) ); // null, sem correspondência!
```

Vamos corrigi-lo adicionando espaços ao padrão regexp `padrão:\d - \d`:

```js run
alert( "1 - 5".match(/\d - \d/) ); // 1 - 5, agora funciona
// ou podemos usar a classe \s:
alert( "1 - 5".match(/\d\s-\s\d/) ); // 1 - 5, também funciona
```

**Um espaço é um caractere. Igual em importância com qualquer outro caractere.**

Não podemos adicionar ou remover espaços de uma expressão regular e esperamos funcionar da mesma maneira.

Em outras palavras, em uma expressão regular, todos os caracteres são importantes, espaços também.
````

## Resumo

Existem as seguintes classes de caracteres:

- `padrão:\d` - dígitos.
- `padrão:\D` - sem dígitos.
- `padrão:\s` - símbolos de espaço, tabulações, novas linhas.
- `padrão:\S` - todos, exceto `padrão:\s`.
- `padrão:\w` - Letras latinas, dígitos, sublinhado `'_'`.
- `padrão:\W` - todos, exceto `padrão:\w`.
- `padrão:.` - qualquer caractere se estiver com a flag regexp `'s' `; caso contrário, qualquer um, exceto uma nova linha `\n`.

...Mas isso não é tudo!

A codificação unicode, usada pelo JavaScript para strings, fornece muitas propriedades para caracteres, como: a qual idioma a letra pertence (se é uma letra), é um sinal de pontuação etc.

Também podemos pesquisar por essas propriedades. Isso requer a flag `padrão:u`, abordada no próximo artigo.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.