caracteres opcionais em um regex

votos
6

A tarefa é bastante simples, mas eu não tenho sido capaz de chegar a uma boa solução ainda: uma string pode conter números, traços e sinais de adição, ou apenas números.

^[0-9+-]+$

faz mais do que eu preciso, exceto quando um usuário entra lixo como + - + - +

Eu não tive sorte com lookahead regular, uma vez que os traços e vantagens poderiam estar em qualquer lugar na string.

strings válidas:

  1. 234654
  2. 24-3 + -2
  3. -234
  4. 25485+

Inválido:

  1. ++ - +
Publicado 19/05/2009 em 18:16
fonte usuário
Em outras línguas...                            


5 respostas

votos
15

Que tal agora:

([+-]?\d[+-]?)+

o que significa "um ou mais dígitos, cada um dos quais pode ser precedido ou seguido por um mais ou menos opcional".

Aqui está um script de teste Python:

import re
TESTS = "234654 24-3+-2 -234 25485+ ++--+".split()
for test in TESTS:
    print test, ":", re.match(r'([+-]?\d[+-]?)+', test) is not None

que imprime este:

234654 : True
24-3+-2 : True
-234 : True
25485+ : True
++--+ : False
Respondeu 19/05/2009 em 18:22
fonte usuário

votos
8

E se:

^[0-9+-]*[0-9][0-9+-]*$

Isso garante que há pelo menos um dígito em algum lugar na cadeia. (Parece que ele pode ter um monte de retrocesso, apesar de tudo. Mas, por outro lado, não tem a + ou * acondicionada dentro de uma outra + ou *, que eu não gosto de qualquer um.)

Respondeu 19/05/2009 em 18:20
fonte usuário

votos
2
^([+-]*[0-9]+[+-]*)+$

Outra solução usando um olhar positivo por trás afirmação garantindo que há no menos um número.

^[0-9+-]+$(?<=[0-9][+-]*)

Ou usando um olhar positivo frente afirmação.

(?=[+-]*[0-9])^[0-9+-]+
Respondeu 19/05/2009 em 18:21
fonte usuário

votos
0

Eu faria isso como este:

^[-+]*\d[\d+-]*$

Rápido é bom!

Respondeu 25/04/2011 em 01:09
fonte usuário

votos
0

eu gosto de

^(?=.*\d)[\d+-]+$ 

solução, eu mesmo. Ele diz exatamente o que você precisa, sem necessidade de qualquer cabeça-arranhão.

Respondeu 24/04/2011 em 22:09
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more