Expressões regulares

Olá pessoal estou tentando fazer a validação de nomes, pensei em fazer assim

"nome".matches(\\w*\\s \\w*  );

Mas e as pessoas que tem vários sobrenomes o que eu faço? é uma das primeiras
validações que faço ainda não conheço os métodos mais sofisticados.

Não tenho muita prática em expressões regulares, mas fica a dica de um editor web de expressões regulares para testar seus experimentos:

http://regexpal.com/

:slight_smile:

\w*(\s\w*)*

Significa que o que tá dentro de parêntesis pode repetir 0 ou mais vezes

Eu estou com um problema parecido. Talvez, no seu caso, basta \w.. Tenca ai. Ou [\w\s].(<- esse ponto é final, não faz parte da regex)

Meu problema é o seguinte: eu preciso separar numa frase, o que é nome e o que é número. Não preciso fazer isso ao mesmo tempo, porém tem uma regrinha:

  • determinar se é número quando tiver
    –> número formatado, por exemplo um CPF: 123.456.789-10
    –> número puro, se o cpf acima vier: 12345678910, tem que aceitar
    –> Se tiver espaço ou letras entre os números, então deve ser considerado como números distintos. Exemplo123456 78910 deve considerar 123456 um número e 78910 outro número. O mesmo se aparecer 123456a78910.
    –> deve sempre separar os números quando existir espaços entre eles, independente da quantidade de espaços. Exemplo 12 34 deve pegar os dois números, e 12_______________34 deve pegar os dois número (substitui o espaço por _ para o fórum não corrigir).

  • Quando eu rodar a expressão para capturar texto, então a regra é:
    –> Nomes separados por espaços deve continuar juntos. Por exemplo Ipsum Lorem deve retornar apenas uma string ipsum Lorem. Se for Ipsum, Lorem, nesse caso, retornar duas strings: uma para Ipsum outra para Lorem e ignorar a vírgula e o espaço.

Vamos a um exemplo mais prático. Suponhamos a seguinte entrada de string:

Lorem ipsum dolor 13/04/2012 sit amet 86 consectetuer 123456 adipiscing elit 12.365.478-895 Etiam eget 

Ao passar o parser para número, deve me retornar:
-> 13/04/2012
-> 86
-> 123456
-> 12.365.478-895

depois, ao passar o parser para Texto, deve me retornar:
-> Lorem ipsum dolor
-> sit amet
-> consectetuer
-> adipiscing elit
-> Etiam eget.

Então, a regex para número, eu até conseguir fazer, mas a análise do texto eu ainda não conseguir desenvolver.

Alguém pode me ajudar?

Veja se serve esse Psycopata

[code]import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class GUJ {

public static void main(String[] args) throws Exception {
	String texto = "Lórem ipsum dolor 13/04/2012 sit amet 86 consectetuer 123456 adipiscing elit 12.365.478-895 Etiam eget";
	
	Pattern pattern = Pattern.compile("[\\p{L}\\s]+");
	Matcher matcher = pattern.matcher(texto);
	
	while (matcher.find()) {
		System.out.println(matcher.group().trim());
	}
}

}[/code]

Eu nem sabia que \w pegava dígito também. Mas uma pesquisa rápida e achei no StackOverflow que \p{L} pega somente letras (qualquer uma Unicode)

Versão sem trim(). Era como eu queria fazer primeiramente mas tava me esquecendo de usar group(1) :smiley:

[code]import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class GUJ {

public static void main(String[] args) throws Exception {
	String texto = "Lórem ipsum dolor 13/04/2012 sit amet 86 consectetuer 123456 adipiscing elit 12.365.478-895 Etiam eget";
	
	Pattern pattern = Pattern.compile("\\s*([\\p{L}\\s]+)\\s*");
	Matcher matcher = pattern.matcher(texto);
	
	while (matcher.find()) {
		System.out.println(matcher.group(1));
	}
}

}[/code]

Cara, funcionou muito bem. 1000% perfeito!

Valeu, obrigado!

Só uma correção na versão sem trim()

O certo é “\s*([\p{L}\s][\p{L}])\s” senão vai pegar os espaços no fim

Eu testei mas essa nova fórmula me traz tanto os espaços do início - que não me interessa. Eu deixei, por enquanto, passando pelo trim().

Mesmo assim, muito obrigado!!! :slight_smile: