Tipos Âncora
Vamos agora falar sobre os metacaracteres do tipo âncora. Por que âncora? Porque eles não casam caracteres ou definem quantidades, em vez disso, eles marcam uma posição específica na linha. Assim, eles não podem ser quantificados, então o mais, o asterisco e as chaves não têm influência sobre âncoras.
Circunflexo: ^
O circunflexo também é o marcador de lista negada, mas apenas dentro da lista (e no começo), fora dela, ele é a âncora que marca o começo de uma linha.
^[0-9]
Isso quer dizer: a partir do começo da linha, case um número, ou seja, procuramos linhas que começam com números. O contrário seria:
^[^0-9]
Ou seja, procuramos linhas que não começam com números. O primeiro circunflexo é a âncora e o segundo é o “negador” da lista. É claro que o circunflexo como marcador de começo de linha só é especial se estiver no começo da ER por que não faz sentido procurarmos uma palavra seguida de um começo de linha, pois se tiver uma palavra antes do começo de uma linha, ali não é o começo da linha! Desse modo, a ER:
[0-9J^
Casa um número seguido de um circunflexo literal, em qualquer posição da linha. E essa ER casa o que?.
^^
Essa ER procura por linhas que começam com um circunflexo.
Exercício
-
Em português todos sabem que a fala de alguém começa com travessão -
$ egrep '^-' <arquivo>
Cifrão: $
Complementar ao circunflexo, o cifrão marca o fim de uma linha e só é válido no final de uma ER. Como o exemplo anterior, [0-9]$ casa linhas que terminam com um número.
E o que você me diz da ER ^$
?
- Hmmmm… Começo de linha, com o fim de linha… Uma linha vazia?
Acertou! É sempre bom ter essa ER na manga, pois procurar por linhas em branco é uma tarefa comum nas mais diversas situações.
Expressão | Match |
---|---|
…..$ | Últimos 5 caracteres de uma linha |
^.{20,60}$ | Linhas que tenham de 20 a 60 caracteres |
Exercícios
-
Se eu quero restringir uma tag input para somente números, preciso de um metacaractere para representar números, nada melhor que a lista com todos os caracteres permitidos
Também vou precisar de um metacaractere que quantifique as repetições, como pode ter vários números, inclusive nenhum, podemos usar o asterisco.
$ egrep '^[0-9]*$' <arquivo>
Se o mínimo de repetições fosse um, podiamos usar o mais +.
Se tivesse uma faixa de repetições, podiamos usar as chaves {,}
-
Existem várias formas de fazer isso, provavelmente você quer ver a resposta e comparar com o seu, mas talvez não esteja exatamente igual. Optei por uma simples para começar, mas essa não é a melhor forma de validar email e sim simples.
Pessando antes do @, podemos aceitar qualquer caracter que seja letra, número, e também alguns outros símbolos. As repetições tem que ser no mínimo 1, então o + casa bem.
Após o @, podemos aceitar apenas letras minúsculas e um ponto entre eles. A repetição do domínio pode ter no mínimo 1 caractere, depois do domínio tem que ter duas ou três ocorrências.
$ egrep '([A-Za-z0-9]|[-_])+@[a-z]+\.[a-z]{2,3}' emails.txt
Relembrando que essa é uma das formas!
Borda: \b
A borda, que como o próprio nome já diz, marca uma borda, mais especificamente, uma borda de palavra. Ela marca os limites de uma palavra, ou seja, onde ela começa e/ou termina.
Muito útil para casar palavras exatas, e não partes de palavras. Veja como se comportam as ERs nas palavras dia, diafragma, melodia, radial e bom-dia!:
Expressão | Match |
---|---|
dia | dia, diafragma, melodia, radial, bom-dia! |
\bdia | dia, diafragma, bom-dia! |
dia\b | dia, melodia, bom-dia! |
\bdia\b | dia, bom-dia! |
A borda força um começo ou a terminação de uma palavra. Entenda que “palavra” aqui é um conceito que engloba [A-Za-z0-9_] apenas, ou seja, letras, números e o sublinhado.
Por isso \bdia\b
também casa bom-dia!, pois o traço e a exclamação não são parte de uma palavra.
Exercício
-
Sem comentários.
$ egrep '\b[01]+\b' <arquivo>
Resumos
- Circunflexo
- Serve para procurar palavras no começo da linha.
- Só é especial no começo da ER (e de uma lista).
- Cifrão
- Serve para procurar palavras no fim da linha.
- Só é especial no final da ER.
- Borda
- A borda marca os limites de uma palavra.
- O conceito “palavra” engloba letras, números e o sublinhado.
- A borda é útil para casar palavras exatas e não parciais.