Por que esse número é correspondido com esse regex?

3

O regex é -?([0-9]|([1-9][0-9])) .

O número é -2231 e está sendo correspondido. Pelo que entendi, deveria ser um único dígito ou dois dígitos. Por que esse número é correspondido com esse regex?

    
por Rashad 08.02.2018 / 16:45

2 respostas

21

A expressão regular não está ancorada, portanto, é livre combinar os primeiros 1 ou dois números e "ter sucesso", deixando os números finais (com êxito) sem correspondência.

Se você precisar de números de 1 ou 2 dígitos, ancore o regex:

'^-?([0-9]|([1-9][0-9]))$'

Alguns exemplos:

$ seq -100 -99 | grep -E '^-?([0-9]|[1-9][0-9])$'
-99

$ seq 99 100 | grep -E '^-?([0-9]|[1-9][0-9])$'
99

$ seq -9 9  | grep -E '^-?([0-9]|[1-9][0-9])$'
-9
-8
-7
-6
-5
-4
-3
-2
-1
0
1
2
3
4
5
6
7
8
9

$ seq -2231 -100 | grep -E '^-?([0-9]|[1-9][0-9])$'
(empty)
    
por 08.02.2018 / 16:55
14

A maioria dos programas que usam padrões de regex realmente implementam uma pesquisa do padrão, em vez de uma correspondência de cadeia completa . O Python possui métodos search() e match() distintos, em que search() corresponde a qualquer lugar da string e match() apenas no início. grep tem a opção -x para exigir uma correspondência com a string inteira; Por padrão, ele corresponde a qualquer lugar da string. Outros, como sed , awk e Perl, ficarão felizes em procurar o padrão em qualquer lugar da string. Use os modificadores ^ e $ ("âncoras") para forçar o padrão ao início ou ao final da sequência (respectivamente).

Então, o padrão ERE que você deseja é provavelmente este:

^-?[1-9]?[0-9]$
    
por 08.02.2018 / 17:15