Skip to content

Multiline mode of anchors ^ $, flag "m" #421

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

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Changes from 1 commit
Commits
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
reflect changes in other articles
  • Loading branch information
peruibeloko committed Jan 28, 2024
commit 5eead1fce362b2527f8f0c519ef34a1974f865ea
20 changes: 10 additions & 10 deletions 9-regular-expressions/05-regexp-multiline-mode/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ O modo multilinha é ativado pela flag `pattern:m`.

Ela afeta apenas o comportamento do `pattern:^` e `pattern:$`.

No modo multilinha, eles não casam somente o começo e o fim de uma string, mas também o começo e o fim de linhas.
No modo multilinha, eles não correspondem somente ao começo e o fim de uma string, mas também ao começo e o fim de linhas.

## Busca no início da linha ^

O exemplo abaixo tem várias linhas. O padrão `pattern:/^\d/gm` casa um caractere no começo de cada linha:
O exemplo abaixo tem várias linhas. O padrão `pattern:/^\d/gm` corresponde a um caractere no começo de cada linha:

```js run
let str = `1st place: Winnie
Expand All @@ -20,7 +20,7 @@ console.log( str.match(/^\d/gm) ); // 1, 2, 3
*/!*
```

Sem a flag `pattern:m` somente o primeiro dígito será casado:
Sem a flag `pattern:m` somente o primeiro dígito será encontrado:

```js run
let str = `1st place: Winnie
Expand All @@ -32,17 +32,17 @@ console.log( str.match(/^\d/g) ); // 1
*/!*
```

Isso acontece porque por padrão, o acento circunflexo `pattern:^` casa apenas com o começo da string -- e no modo multilinha no começo de cada linha.
Isso acontece porque por padrão, o acento circunflexo `pattern:^` corresponde apenas com o começo da string -- e no modo multilinha no começo de cada linha.

```smart
Formalmente, "começo de linha" quer dizer "imediatamente após uma quebra de linha": o teste `pattern:^` no modo multilinha casa todas as posições precedidas por um caractere de nova linha `\n`, bem como o início da string como um todo.
Formalmente, "começo de linha" quer dizer "imediatamente após uma quebra de linha": o teste `pattern:^` no modo multilinha corresponde a todas as posições precedidas por um caractere de nova linha `\n`, bem como o início da string como um todo.
```

## Busca no fim da linha $

O cifrão `pattern:$` se comporta de maneira similar.

A expressão regular `pattern:\d$` casa com o último dígito de cada linha
A expressão regular `pattern:\d$` corresponde ao último dígito de cada linha

```js run
let str = `Winnie: 1
Expand All @@ -52,10 +52,10 @@ Eeyore: 3`;
console.log( str.match(/\d$/gm) ); // 1,2,3
```

Sem a flag `pattern:m`, o cifrão `pattern:$` casaria apenas com o fim da string inteira, então apenas o último dígito seria encontrado.
Sem a flag `pattern:m`, o cifrão `pattern:$` corresponde apenas ao fim da string inteira, então apenas o último dígito seria encontrado.

```smart
Formalmente, "fim de linha" quer dizer "imediatamente antes de uma quebra de linha": o teste `pattern:$` no modo multilinha casa todas as posições sucedidas por um caracter de nova linha `\n`, bem como o fim da string como um todo.
Formalmente, "fim de linha" quer dizer "imediatamente antes de uma quebra de linha": o teste `pattern:$` no modo multilinha corresponde a todas as posições sucedidas por um caractere de nova linha `\n`, bem como o fim da string como um todo.
```

## Busca por \n ao invés de ^ e $
Expand All @@ -74,9 +74,9 @@ Eeyore: 3`;
console.log( str.match(/\d\n/g) ); // 1\n,2\n
```

Como podemos ver, temos dois casamentos ao invés de 3
Como podemos ver, temos duas correspondências ao invés de 3

Isso ocorre porque não há uma quebra de linha após o `subject:3` (Mas temos o fim da string, então ele casa com o `pattern:$`)
Isso ocorre porque não há uma quebra de linha após o `subject:3` (Mas temos o fim da string, então ele corresponde com o `pattern:$`)

Outra diferença: Agora cada correspondência inclui um caractere de nova linha `match:\n`. Diferentemente das âncoras `pattern:^` e `pattern:$`, que testam apenas a condição (início ou fim de uma linha), `\n` é um caractere, então ele se torna parte do resultado.

Expand Down