Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Bruno Augusto

Expressão Regular...

Recommended Posts

Caaaara!

 

Nunca pensei que essa bobeira fosse me dar tanto trabalho. Tentei uma pá de combinações, olhando pra frente e pra trás (na ER :P ) e não consigo.

 

Seria casar todos os valores em ponto flutuante antre o zero e o um com APENAS 3 casas decimais. Ex (com as saídas esperadas pelo analisador da ER):

 

1 // TRUE
0 // TRUE
1.0 // FALSE
0.9 // TRUE
0.123 // TRUE
0.1234 // FALSE

Alguém tem uma luz?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hi.

 

Cara, não entendi muito o "antre o zero e o um com APENAS 3 casas decimais.". O que seria entre o zero e o um?

Não sei se está correto por causa dessa dúvida, mas consegui o resultado que você exemplificou aqui.

 

:~$ perl -E 'for (qw(1 0 1.0 0.9 0.123 0.1234)) { say $_ . ": " . (/^(0(\.\d{1,3})?|1\.?)$/ ? "TRUE" : "FALSE") }'
1: TRUE
0: TRUE
1.0: FALSE
0.9: TRUE
0.123: TRUE
0.1234: FALSE

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, o "antre" foi erro de "anta" :lol:

 

Mas já que entendeu que seria um a "entre", seria:

 

0, 0.001, 0.002, 0.003..... 0.999, 1

 

Só que NÃO PODE ter quatro casas decimais, uma vez que usarei para validar uma especificação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ué, cadê o botão de Editar? Bom...

 

Acho que consegui alguma coisa (bem espaçado para comentar):

 

';\s*?q=
(1|0                                    # 1 ou 0
(\.                             # Ponto Literal
	([0-9]{1,2}[1-9]|       # Um ou dois zeros seguidos por 1...9 -OU-
	 [0-9][1-9][0-9]?|      # Zero seguido por 1...9, seguido por um 0...9 opcional -OU-
	 [1-9]                  # 1...9 seguido por:
	 	([0-9]{0,2}|    # Nenhum até dois 0...9 -OU-
	 	 [0-9][1-9]|    # 0...9 e então seguido por 1...9 -OU-
	 	 [1-9]{1,3}     # 1...9, de um até três
	 	)
	 )
)?                              # Tudo opcional, e se refere ao intervalo de floats
)'

Mas tem um probleminha que, se não resolvido via ER, terei de ver via linguagem servidor (PHP).

 

Se eu testo contra uma string preparada para tanto, isto é, fora do contextode uma frase, por exemplo, sou obrigado a usar as âncoras de início e fim ( ^ e $ ).

 

Porém não sei se é deficiência da linguagem servidor, que simplesmente ignora o controle {entre chaves} feito.

 

Ignora no sentido de, por exemplo, {0,2} não é entendido como deveria: Nenhum, um ou dois; e sim: Nenhum, um ou no mínimo dois, fazendo com que 0.999 fosse tão válido quanto 0.9999 o que, para o caso não poderia acontecer.

 

Agora, dentro de um contexto, com texto antes e depois (que também serão casados), obviamente não posso usar as tais âncoras e, sendo assim, simplesmente não consigo controlar o limite de três casas decimais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, vou dar uma ressucitadinha básica para tentar finalizar a questão.

 

Depois boas lutas consegui criar a ER completa para validar o float range. Tinha uma pequena falha na ER anterior onde [1-9]{1,3} deveria ser, na verdade, [1-9]{1,2}.

 

Isso, mais a âncora de final e consegui validar.

 

Mas aconteceu outro problema. O texto que preciso validar, pode ou não ter esse float range.

 

E daí que não consigo tornar opcional (já que "opcionalizar" não deve existir) um grupo anexado à uma âncora.

 

O texto faz parte de uma especificação RFC, especificamente nesse caso, o HTTP Header Accept-Charset

 

As duas ER's que fiz, separadas por legibilidade são:

 

Para o Charset

[a-zA-Z0-9:_+-]

E para o Quality Factor ("peso" do Charset):

 

;q=
              (1|0                         # 1 or 0
                     (\.                      # Literal dot
                         ([0-9]{1,2}[1-9]|    # One or Two Zeroes followed by 1...9                    -OR-
                          [0-9][1-9][0-9]?|   # Zero followed by 1...9, followed by an optional 0...9  -OR- 
                          [1-9]               # 1...9 followed by:
                             ([0-9]{0,2}|     # None and up to Two 0...9                               -OR-
                              [0-9][1-9]|     # 0...9 and then followed by 1...9                       -OR-
                              [1-9]{1,2}      # 1...9 once or twice
                             )
                          )
                     )?                       # All this is optional, and refers to float range
                 )

Desculpem a péssima indentação do CODE acima.

 

Separado funciona, mas junto não pois um valor válido para Accept-Charset pode ou não ter o Quality Factor. Mas como a ER "final" tem âcora de fim:

 

sprintf( '@%s%s$@x', "primeira ER", "segunda ER" )

Obriga a existir o dito parâmetro. Mas segundo a RFC, se ausente seu valor é considerado como 1.

 

Escrevi muito de novo. Mas para resumir é bem o título mesmo.

 

Precisaria de algo como:

 

 

sprintf( '@%s(%s)?$@x', "primeira ER", "segunda ER" )

Mas esse opcional não está funcionando.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.