# Regular Expressions (RegEx)
> Expressões regulares são padrões utilizados para selecionar combinações de caracteres em uma string. Em JavaScript, expressões regulares também são objetos. Elas podem ser utilizadas com os métodos *exec* e *test* do objeto RegExp, e com os métodos *match*, *replace*, *search*, e *split* do objeto String. _(MDN)
- .test() -> true/false
- exec() -> array
- .match() -> array/null
- search() -> índice/-1
- replace() -> procura e substitui
- split -> usa a regex ou uma string fixa para 'quebrar' uma string dentro de um array de substrings
> Quando você quer saber se um padrão é encontrado em uma string, use o método test ou search; para mais informações (mas execução mais lenta) use o método exec ou match. _(MDN)
## Modificadores
- i -> /code/i : ignora se é maiúscula ou minúscula
- g -> /code/g : encontra todas as compatibilidades
- m -> /code/m : verificação multilinha
## Alcance [ ]
- `/[abc]/` : busca por qualquer um dos caracteres entre [] (ou seja, procura por 'a', 'b', 'c')
- `/[x-y]/` : busca por caracteres entre a primeira letra e a segunda -> exemplo: de 'a' a 'z' -> a-z
- `/[0-9]/` : busca por qualquer caracteres entre os números estipulados
- `/[x|y]/` : busca por x ou y..
- `/[^code]/` : busca por caracteres diferentes dos informados -> exemplo: `/[^aeiou]/` -> procura por caracteres que não sejam vogais
- `/[code+]/` : busca por uma ou mais ocorrências -> exemplo:
```js
/[o+]/
* ['ovo'] // => ['o', 'o']
* ['voo'] // => ['oo']
* ['voa'] // => ['o']
```
- `/[code*]/` : busca por ou mais ocorrências
- `/[code]?/` : busca pela menor ocorrência (trecho)
exemplo
`'economia'.match(/o[a-z]*?o/) => 'ono'`
## Quantificadores
- n+ : busca por pelo menos uma ocorrência
- n* : busca por qualquer string que contenha 0 ou mais ocorrências de n
- n? : busca por 0 ou 1 ocorrência de n
- n{X} : busca a ocorrência de uma sequência de 'X' vezes -> ex: '1000, 10, 100, 1000'.match(/\d{4}/g)
TODO...cont
## Caracteres especiais
- \ : uma barra invertida que preceda um caractere não especial significa que o caractere seguinte é especial e não deve ser interpretado de forma literal. _(MDN)
- ^: procura por todos os caracteres que não sejam os informadaos.
TODO...cont
## literal
```js
/code/
```
ex:
```js
console.log(/comp/.test('computador')); // true
```
## Ou -> |
```js
/code1 | code2 | code3/
```
ex:
```js
console.log(/ball | dog | cat/.test('I see a dog.')); // false, pois considera o espaço em branco
console.log(/ball|dog|cat/.test('I see a dog')); // true
```
## Trecho
```js
/.code/
```
e
```js
/code./
`
ex:
```js
'brasileiro'.match(/br./)
```
## Procurar caracteres diferentes dos informados
```js
/[^code]/
```
## Procurar por ocorrência no início (^)
```js
/^code/
```
ex:
```js
let greeting = "Hello World!";
let greetRegex = /^Hello/;
let result = greetRegex.test(greeting); => true
```
## Procurar por ocorrência no final ($)
```js
/code$/
```
ex:
```js
let greeting = "Hello World!";
let greetRegex = /World$/;
let result = greetRegex.test(greeting); => true
```
## Procurar por mais de uma ocorrência seguida
```js
/code+/
```
Ex:
```js
'voo'.match(/o+/g)
// => 'oo'
```
## Atalho: procurar todas as letras (maiúsculas e minúsculas), números e _ (\w)
```js
[A-Za-z0-9_] = /\w/g
```
## Atalho: procurar todos os símbolos menos as letras (maiúsculas e minúsculas), números e _ (\W)
```js
[^A-Za-z0-9_] = /\W/g
```
## Atalho: procurar todas ocorrências de números (\d)
```js
[0-9_] = /\d/g
```
ex
```js
let numString = "Ganhamos um aumento de 10%";
let noNumRegex = /\D/g; // Change this line
let result = numString.match(noNumRegex).length;
// => 24
```
## Atalho: procurar por espaços em branco (\s)
```js
/\s/g
```
## Atalho: procurar por caracteres que não são espaços em branco (\S)
```js
/\S/g
```
## Especificador de quantidade ({n,n})
(Procura ocorrência entre quantidade de um nº ao outro de vezes)
```js
/code{n,n}code/
```
```js
/code{n,}code/
```
ex:
```js
/ola{3,}a/.test('olaaaaa') // => true
```
## Especificador exato de quantidade ({n})
```js
/code{n}code/
```
## Procurar 0 ou 1 ocorrência de caractére (?)
```js
/code?/
```
ex:
```js
/ama?/.test('ama') // => true
/ama?/.test('amar') // => true
/ama?/.test('amora') // => false
```
## Positive lookahead (?=...)
```js
/(?=code)/
```
ex: checar se a senha tem entre 3 e 6 caracteres e pelo menos um número.
```
let senha = "ola321";
let checarSenha = /(?=\w{3,6})(?=\D*\d)/;
checarSenha.test(senha); // => true
```
## Negative lookahead (?=!...)
```js
/(?=!code)/
```
## Repetição de grupo (()\número de vezes)
(funciona com .test e .match)
```js
/(code)\número de vezes/
```
ex:
```js
/(\w+)\s\1/;
```
## Capturar ocorrência e substituir (.replace)
ex:
```js
'Hello mundo!'.replace(/Hello/, 'Olá') // => "Olá mundo!"`
`'bem tudo'.replace(/(\w+)\s(\w+)/, '$2 $1'); // => "tudo bem"`
`'99991111'.replace(/(\d{4})(\d{4})/, '$1-$2'); // => "9999-1111"
```