Ajuda para validar strings

Olá estou querendo implementar um método que valide se uma string começa com algum caracter especial (!#@$%¨&* e etc menos o _ ) ou se começa com algum número… acho que com expressões regulares eu conseguiria saber neh? mas como eu poderia fazer? obrigado!

anderson_lp789,

Aqui no guj tem um artigo de Expressões Regulares , segue o link abaixo espero ter ajudado :

http://www.guj.com.br/article.show.logic?id=1

:wink:

sim já vi este tópico… mas como montar uma expressao regular colocando “se começar com caracter especial exceto _ está correto”? não consigo visualizar isso :cry:

Tente a seguinte regular expression:

String reg = "[^x].+";

onde “x” indica o caracter q voce deseja excluir

t+

entendi! eu montei isso daqui:

[code]
String teste = “_m*unome”;
//Pattern regex = Pattern.compile("[^x].+");
String[] resultado = teste.split("[^a-z1-9_A-Z].+");

	for (int i =0, n = resultado.length; i < n; i++)
		System.out.println(resultado[i]);[/code]

onde se o resultado nao tiver nada, quer dizer que tem caracter especial não permitido. Seria isso mesmo?!

Não é para usar split, e sim matches. Ele retorna true se bater, e false se não bater.

como assim? hmm eu tentei da seguinte mas não deu mito certo… ele está me retornando a string q vem depois por exmeplo:

[code]String teste = “_munome”;
Pattern regex = Pattern.compile("[^a-z_].+");
/* String[] resultado = teste.split("[^a-z_].+");

	for (int i =0, n = resultado.length; i < n; i++)
		System.out.println(resultado[i]); */
	Matcher m = regex.matcher(teste);
	if (m.find())
		System.out.println(m.group());[/code]

nesse caso ele me retorna _munome

se eu mudar o valor da string teste para => “_m*unome”
ele me retorna => *unome

no que estou errando?

String s = "*_m*unome";

if (s.matches ("[!#@$%¨&*0-9].*")) {
    System.out.println ("A string começa por um desses caracteres especiais, ou por número");
} else {
    System.out.println ("Não bateu");
}

entendi, muito obrigado pelo exemplo. Mas qual é a diferença de eu usar o split e dessa forma que me passou?

Split serve para quebrar strings, não para validá-las (até pode ser usado para isso, mas deixa seu código difícil de entender).

Para cada uso, ache a ferramenta adequada. Só porque você só conhece o martelo (e você até consegue apertar alguns tipos de parafusos com ele) não é para você usar só o martelo; aprenda a usar uma chave de fenda também.

Para acessar o catálogo da loja de ferramentas, vá até:

http://download.oracle.com/javase/6/docs/api/index.html

Problemas? Use o Google Translator se tiver problemas com o inglês.

Não tenha vergonha de usá-lo. Por exemplo, ontem mesmo usei o Google Translator para ler esta notícia aqui:

http://www.trud.bg/Article.asp?ArticleId=598482

Você consegue ler isto aqui?

Nem eu. Mal e mal reconheço a palavra “prezident”. Mas o Google Translator deu a tradução - meio capenga, mas perfeitamente legível:

http://translate.google.com.br/translate?u=http%3A%2F%2Fwww.trud.bg%2FArticle.asp%3FArticleId%3D598482&sl=bg&tl=pt&hl=&ie=UTF-8

Ou seja, “Dilma venceu o câncer, e vai concorrer à Presidência”.

sim você tem razão. Eu estou apenas começando com as expressões regulares mesmo, então não sei as manhas ainda. Olhá só o que eu fiz:

[code]
String teste = “á%_A*unome”;

	//desta forma ateh palavras que comecam com acento sao invalidas
	if (teste.matches("[a-zA-Z_].*"))
		System.out.println("valido");
	else
		System.out.println("invalido");
	
	
	//jah desta forma ele aceita coisas com acento
	if (teste.matches("[!#@$%¨&*0-9].*"))
		System.out.println("invalido");
	else
		System.out.println("valido"); [/code]

No caso, para deixar liberado palavras que começam com acento, por exemplo o á, ñ, como faz? (só a nivel de curiosidade) é que se eu for listar os caracteres especiais TODOS que tem eu poderia levar um certo tempo e ainda correr riscos de esquecer algum! Então achei melhor usar a primera tecnica, da sequencia de if e else…

oq vc acha?

Ah, isso é mais chatinho que parece. Vou mostrar como é que se aceitam as mesmas letras e números (e também um _) como um identificador java:

“[\p{javaIdentifierStart}].*”

Isso pega qualquer coisa que comece por letras (acentuadas ou não) ou _ (e também $)

Dê uma olhada em:

http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html
e
http://download.oracle.com/javase/6/docs/api/java/lang/Character.html

hummm vc iria ficar muito bravo se eu dissesse que eu me atrapalhei com o que precisava? :roll:

preciso só validar se a string contem apenas numeros, underline e caracteres normais (sem acentuação) e que ela nao pode começar com numeros… desculpa mesmo… mas eu entendi a ideia

fiz desta maneira mas nao deu certo… se tiver caracter especial no meio ele da como válido =/

[code]String teste = “_aunome”;

	if (teste.matches("[a-zA-Z_].*[a-zA-Z0-9_]"))
		System.out.println("valido");
	else
		System.out.println("invalido");[/code]

Ele considera caracteres especiais como válido porque o ponto casa com qualquer caractere e o asterisco em seguida permite múltiplas ocorrências.

Tente assim:

"[a-zA-Z_][a-zA-Z0-9_]*"

Assim ele verifica se o primeiro caractere é uma letra ou underline e em seguida permite que hajam nenhuma, uma ou mais ocorrências de caracteres que sejam letras, números ou underline.

[quote=Eric Yuzo]Ele considera caracteres especiais como válido porque o ponto casa com qualquer caractere e o asterisco em seguida permite múltiplas ocorrências.

Tente assim:

"[a-zA-Z_][a-zA-Z0-9_]*"

Assim ele verifica se o primeiro caractere é uma letra ou underline e em seguida permite que hajam nenhuma, uma ou mais ocorrências de caracteres que sejam letras, números ou underline.[/quote]

ahhh entendi agora pro que servia o asterisco ahdsuah Nossa muito boa sua explicação, agora ficou muito mais claro onde eu estava errando., Obrigado mesmo deu certinho