Uma ajuda em Regex

3 respostas
J

ola pessoal sempre tive problema em regex… num consigo entender!!!
tava tentando estudar por esse tutorial aqui do guj mais cada vez me complico mais, tem cada coisa absurda do Livro SCJP da Kathy…

alguem pode me explicar esse codigo

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DataBrasileiroString {
	public static void main(String[] args) {
		String data = "12-30-2002"; // MM-DD-AAAA
		Pattern p = Pattern.compile("(\d\d)-(\d\d)-(\d\d\d\d)");
		Matcher m = p.matcher(data);
		if (!m.find()) {
		     throw new Exception("A data não está no formato americano");
		}
		String dataBrasileira = m.replaceAll("\$2/\$1/\$3");	
	}
}

alguem connhece algum tutorial mais claro e que seja mais avançado, assim só a ponto do necessario para certificação…

3 Respostas

bcartaxo

o pattern q ele compila ta blz, ele cria um padrão para a data da seguinte forma: dois inteiros seguidos de um hífen seguido de dois inteiros seguidos de um hífen seguido de quatro inteiros, cria o objeto Matcher, para “emaprelhar” com o pattern, chama o metodo find do Matcher, se ele achar o pattern com o dato passado, ele executa o codigo do if. O estranho ta essa exceção, esse códigod e certo nem irá compilar, ele levanta uma Checked exception e nem trata nem declara q lança, e obviamente n pdoeria lançar, ja q ja se sta no main.

Pedrosa

De uma olhada nesse tutorial:

http://guia-er.sourceforge.net/objetivo.html

peczenyj

A expressão regular
(\d\d)-(\d\d)-(\d\d\d\d)

na verdade é

(\d\d)-(\d\d)-(\d\d\d\d)

vc coloca 2 contra-barras para que saia uma, afinal é tratado como uma string.

explicando: \d é uma ER que casa, ou seja, encontra um dígito de 0 a 9.

\d\d representa 2 dígitos seguidos, 00 a 99

os parentesis, nesse caso, são agrupamentos de ERs que, IMHO, são desnecessários. vc agrupa em 3 casos:

  • Quando quer ter mais clareza na ER (é o que parece)
  • Quando quer usar “OU”: (super|hiper)-mercado
  • Quando vai utilizar retrovisores: (\d)\1
    nesse exemplo vc esta procurando um número qualquer repetido (22,44,etc)

Essa ER poderia ser escrita assim:

\d{2}-\d{2}-\d{4}

entretanto, se a data é no formato MM-DD-AAAA, vc não tem mes 40, nem 00, tem?

Seria os meses de 01 ate 09 + 10, 11 e 12:

(0[1-9])-\d{2}-\d{4} OU (1[0-2])-\d{2}-\d{4}

b-\d{2}-\d{4}[/b]

DD vai de 1 ate 31, certo?

01 a 09, 11 a 19, 21 a 29 + 10, 20, 30 + 31

(0[1-9]|1[0-2])-([0-2][1-9])-\d{4} OU (0[1-9]|1[0-2])-([1-3]0)-\d{4} OU (0[1-9]|1[0-2])-(31)-\d{4}

b-([0-2][1-9]|[1-3]0|31)-\d{4}[/b]

Parece dificil? Basta ir fazendo experiências :wink:

Criado 17 de setembro de 2007
Ultima resposta 17 de set. de 2007
Respostas 3
Participantes 4