- Notifications
You must be signed in to change notification settings - Fork111
Patterns and flags#147
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
Uh oh!
There was an error while loading.Please reload this page.
Changes fromall commits
efa4871
b707c26
b45e0db
e3fbf39
2e57ce5
a27c352
7481795
9166ab4
c061b7a
4f5464d
3b1b03f
48e7e8c
d3d72e3
91686e7
File filter
Filter by extension
Conversations
Uh oh!
There was an error while loading.Please reload this page.
Jump to
Uh oh!
There was an error while loading.Please reload this page.
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
@@ -1,177 +1,177 @@ | ||||||||||
#Padrões e flags | ||||||||||
Expressões regulares são padrões que fornecem uma maneira poderosa de pesquisar e substituir no texto. | ||||||||||
Em JavaScript,elas estão disponíveis através do objeto[RegExp](mdn:js/RegExp), além de estarem integradas em métodos de strings. | ||||||||||
##Expressões regulares | ||||||||||
Uma expressãoregular(também "regexp" ou apenas "reg")consiste em um *padrão* e*flags* opcionais. | ||||||||||
Existem duas sintaxes que podem ser usadas para criar um objeto de expressão regular. | ||||||||||
A sintaxe "longa": | ||||||||||
```js | ||||||||||
regexp = new RegExp("padrão", "flags"); | ||||||||||
``` | ||||||||||
E a "curta", usando barras `"/"`: | ||||||||||
```js | ||||||||||
regexp = /padrão/; //sem flags | ||||||||||
regexp = /padrão/gmi; //com flags`g`, `m` e `i` (a ser abordado em breve) | ||||||||||
``` | ||||||||||
Barras `pattern:/.../`informam aoJavaScriptque estamos criando uma expressão regular. Eles desempenham o mesmo papel que aspas para strings. | ||||||||||
Em ambos os casos, a`regexp`se torna numa instância da classe interna`RegExp`. | ||||||||||
A principal diferença entre essas duas sintaxes é que o padrão usando barras`/.../`não permite a inserção de expressões (como modelos de stringliterais com`${...}`).Eles são totalmente estáticos. | ||||||||||
As barras são usadas quando conhecemos a expressãoregularno momento da escrita do código - e essa é a situação mais comum. Enquanto `new RegExp`é mais frequentemente usada quando precisamos criar umaregexp "de improviso" a partir de umastring gerada dinamicamente. Por exemplo: | ||||||||||
```js | ||||||||||
let tag = prompt("Qual tagvocê deseja encontrar?", "h2"); | ||||||||||
let regexp = new RegExp(`<${tag}>`); //igual a /<h2>/se respondeu "h2"nopromptacima | ||||||||||
``` | ||||||||||
## Flags | ||||||||||
Expressões regulares podem ter flagsque afetam a pesquisa. | ||||||||||
Existem apenas 6 delas em #"9f1f49f13800363ac0c70439f5395ee131289667ca0541040cb2e1f975433ca8"> | ||||||||||
`pattern:i` | ||||||||||
:Com essa flag, a pesquisa não diferencia maiúsculas de minúsculas: não há diferença entre`A`e `a` (veja o exemplo abaixo). | ||||||||||
`pattern:g` | ||||||||||
:Com essa flag, a pesquisa procura todas as correspondências, sem ela - somente a primeira correspondência é retornada. | ||||||||||
`pattern:m` | ||||||||||
:Modo multilinha (abordado no capítulo <info:regexp-multiline-mode>). | ||||||||||
`pattern:s` | ||||||||||
:Ativa o modo"dotall", que permite que um ponto`pattern:.`corresponda ao caractere de nova linha`\n` (abordado no capítulo <info:regexp-character-classes>). | ||||||||||
`pattern:u` | ||||||||||
:Ativa o suporte completo de Unicode. A flagpermite o processamento correto de pares substitutos. Mais sobre isso no capítulo <info:regexp-unicode>. | ||||||||||
`pattern:y` | ||||||||||
:Modo "fixo": pesquisando na posição exata no texto (abordado no capítulo <info:regexp-sticky>) | ||||||||||
```smart header="Cores" | ||||||||||
A partir daqui, o esquema de cores é: | ||||||||||
- regexp -- `pattern:vermelho` | ||||||||||
- string (onde pesquisamos) -- `subject:azul` | ||||||||||
- result -- `match:verde` | ||||||||||
``` | ||||||||||
##Pesquisando: str.match | ||||||||||
Como mencionado anteriormente, expressões regulares são integradas a métodos de string. | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others.Learn more. Suggested change
Suggested change
| ||||||||||
O método `str.match(regexp)`encontra todas as correspondências de`regexp`na string `str`. | ||||||||||
Possui 3 modos de trabalho: | ||||||||||
1.Se a expressãoregulartiverflag `pattern:g`,ela retornará uma matriz de todas as correspondências: | ||||||||||
```js run | ||||||||||
let str = "Nós vamos, nós vamos sacudir você"; | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others.Learn more. Suggested change
| ||||||||||
alert( str.match(/nós/gi) ); //Nós, nós (uma matriz de 2 substringsque correspondem) | ||||||||||
``` | ||||||||||
Observe que ambas`match:Nós` e `match:nós` são encontradas, porque flag `pattern:i`torna a expressãoregularsem distinção entre maiúsculas e minúsculas. | ||||||||||
2.Se não houver essa flag, ela retornará apenas a primeira correspondência na forma de uma matriz, com a correspondência completa no índice `0`e alguns detalhes adicionais nas propriedades: | ||||||||||
```js run | ||||||||||
let str = "Nós vamos, nós vamos sacudir você"; | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others.Learn more. Suggested change
| ||||||||||
let result = str.match(/nós/i); //sem flag g | ||||||||||
alert( result[0] ); //Nós (1º correspondência) | ||||||||||
alert( result.length ); // 1 | ||||||||||
//Detalhes: | ||||||||||
alert( result.index ); // 0 (posição da correspondência) | ||||||||||
alert( result.input ); //Nós vamos, nós vamos sacudir você (string de origem) | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others.Learn more. Suggested change
| ||||||||||
``` | ||||||||||
A matriz pode ter outros índices, além de`0`se uma parte da expressão regularestiver entre parênteses. Abordaremos isso no capítulo <info:regexp-groups>. | ||||||||||
3.E, finalmente, se não houver correspondências, `null`é retornado (não importa se há flags `pattern:g`ou não). | ||||||||||
Esta é umanuance muito importante. Se não houver correspondências, não receberemos uma matriz vazia, mas receberemos`null`.Esquecer isso pode levar a erros, por exemplo: | ||||||||||
```js run | ||||||||||
let matches = "JavaScript".match(/HTML/); // = null | ||||||||||
if (!matches.length) { // Error: Cannot read property 'length' of null | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others.Learn more. Suggested change
| ||||||||||
alert("Erro na linha acima"); | ||||||||||
} | ||||||||||
``` | ||||||||||
Se quisermos que o resultado seja sempre uma matriz, podemos escrevê-lo desta maneira: | ||||||||||
```js run | ||||||||||
let matches = "JavaScript".match(/HTML/) || []; | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others.Learn more. Suggested change
| ||||||||||
if (!matches.length) { | ||||||||||
alert("Sem correspondências"); //agora funciona | ||||||||||
} | ||||||||||
``` | ||||||||||
##Substituindo: str.replace | ||||||||||
O método `str.replace(regexp,substituição)`substitui as correspondências encontradas usando`regexp`na string `str`por `substituição` (todas as correspondências se houverflag `pattern:g`,caso contrário, apenas a primeira). | ||||||||||
Por exemplo: | ||||||||||
```js run | ||||||||||
//sem flag g | ||||||||||
alert( "Nós vamos, nós vamos".replace(/nós/i, "Eu") ); //Eu vamos, nós vamos | ||||||||||
//com flag g | ||||||||||
alert( "Nós vamos, nós vamos".replace(/nós/ig, "Eu") ); //Eu vamos, Eu vamos | ||||||||||
``` | ||||||||||
O segundo argumento é a string de `substituição`. Podemos usar combinações especiais de caracteres para inserir fragmentos da correspondência: | ||||||||||
|Símbolos |Ação na string de substituição | | ||||||||||
|--------|--------| | ||||||||||
|`$&`|insere toda a correspondência| | ||||||||||
|<code>$`</code>|insere uma parte dastringantes da correspondência| | ||||||||||
|`$'`|insere uma parte dastringdepois da correspondência| | ||||||||||
|`$n`|se `n`for um número de1-2dígitos, ela inserirá o conteúdo dos enésimos parênteses, mais sobre isso no capítulo <info:regexp-groups>| | ||||||||||
|`$<nome>`|insere o conteúdo dos parênteses com o `nome` fornecido, mais sobre isso no capítulo <info:regexp-groups>| | ||||||||||
|`$$`|insere o caractere `$` | | ||||||||||
Um exemplo com o `pattern:$&`: | ||||||||||
```js run | ||||||||||
alert( "Eu amo HTML".replace(/HTML/, "$&e JavaScript") ); //Eu amo HTMLe JavaScript | ||||||||||
``` | ||||||||||
##Teste: regexp.test | ||||||||||
O método `regexp.test(str)`procura pelo menos uma correspondência, se encontrada, retorna `true`,caso contrário,`false`. | ||||||||||
```js run | ||||||||||
let str = "Eu amo JavaScript"; | ||||||||||
let regexp = /AMO/i; | ||||||||||
alert( regexp.test(str) ); // true | ||||||||||
``` | ||||||||||
Mais adiante neste capítulo, estudaremos mais expressões regulares, examinaremos mais exemplos e também conheceremos outros métodos. | ||||||||||
Informações completas sobre os métodos são fornecidas no artigo <info:regexp-methods>. | ||||||||||
##Resumo | ||||||||||
-Uma expressãoregularconsiste em um padrão eflags opcionais: `pattern:g`, `pattern:i`, `pattern:m`, `pattern:u`, `pattern:s`, `pattern:y`. | ||||||||||
-Sem flagse símbolos especiais (que estudaremos mais adiante),a pesquisa por uma regexpé igual à pesquisa com substring. | ||||||||||
-O método `str.match(regexp)`procura por correspondências: todas elas se houver a flag`pattern:g`, caso contrário, apenas a primeira. | ||||||||||
-O método `str.replace(regexp,substituição)`substitui as correspondências encontradas usando`regexp`por 'substituição': todas elas se houver uma flag`pattern:g`, caso contrário, somente a primeira. | ||||||||||
-O método `regexp.test(str)`retorna `true`se houver pelo menos uma correspondência, caso contrário, retorna `false`. |