[RESOLVIDO]Regex - Como definir posição para o match?

Bom dia, galera.

Mais uma vez, por não ter acesso a outros sites no trabalho, venho fazer uma pergunta cuja resposta seria facilmente encontrada no google.
Já dei uma olhada nos topicos sobre regex no GUJ mas nao encontrei o que preciso.

Sei pouco sobre regex. Também sei que o que quero é possível, só nao lembro como.

Gostaria de saber como definir que o primeiro caracter deve estar dentro de um conjunto e o restante dentro de outro conjunto?

Exemplo:
1° caracter = [A-Za-Z]
Restante = [A-Za-z0-9_]

Obrigado!

Pattern pattern = Pattern.compile("[A-Za-z][A-Za-z0-9_]+");

A expressão significa um caracter no conjunto [A-Za-Z] e o restante no conjunto [A-Za-z0-9_], o caracter ‘+’ indica que existirá de 1 a N ocorrências do conjunto precedente.

Dica: expressões regulares são como matemática - uma coisa depende de outra e se você não aprender direitinho desde o começo, não dá para você usar direito. Não dá para saber as coisas “picado” só consultando no GUJ - até porque você pode ter exemplos errados que só por acaso funcionaram :slight_smile:

Uma forma de você aprender direitinho sobre expressões regulares é consultar o site:

http://aurelio.net/regex/

[quote=Big E]Pattern pattern = Pattern.compile("[A-Za-z][A-Za-z0-9_]+");

A expressão significa um caracter no conjunto [A-Za-Z] e o restante no conjunto [A-Za-z0-9_], o caracter ‘+’ indica que existirá de 1 a N ocorrências do conjunto precedente.[/quote]

Cara, obrigado pela explicação sobre o metachar ‘+’.
Porém não funcionou:

String string = "abc";
	    Pattern p = Pattern.compile("[A-Za-z][A-Za-z0-9_]+");		
		Matcher m = p.matcher(string);
		System.out.println(m.find());

O syso imprime “true” pra string igual a “abc” ou “1abc”;

Obrigado pela dica, eu entendo o que quer dizer. Infelizmente o unico site liberado aqui no trabalho é o guj e não há livros para consulta.
Vou dar uma olhada no link em casa. Valeu!

Mas enquanto isso, alguém pode dar outra sugestão?

Utilize ao invés do find() o método matches() pois ele valida a sequência de todo o conjunto, ou seja válida o regex como um todo e não por partes como o método find().

Ficando seu código da seguinte forma.

String string = "abc";  
Pattern p = Pattern.compile("[A-Za-z][A-Za-z0-9_]+");         
Matcher m = p.matcher(string);  
System.out.println(m.matches()); 

[quote=entanglement]Dica: expressões regulares são como matemática - uma coisa depende de outra e se você não aprender direitinho desde o começo, não dá para você usar direito. Não dá para saber as coisas “picado” só consultando no GUJ - até porque você pode ter exemplos errados que só por acaso funcionaram :slight_smile:

Uma forma de você aprender direitinho sobre expressões regulares é consultar o site:

http://aurelio.net/regex/

[/quote]

Se você tivesse acesso a esse site, veria que você pode usar o operador “^”, que indica que deve bater com o começo da string. Por exemplo,

    Pattern pattern = Pattern.compile("^[A-Za-z][A-Za-z0-9_]+");  

Obrigado, Big E. Troquei o find() por matches() e funcionou legal. O javadoc diz exatamente o que vc falou. Valeu!

E entanglement, não sei qual é a da empresa. Ridículo isso de simplesmente bloquear tudo. Até no GUJ eu tenho que ficar copiando os links das consultas e colando na barra de endereço pq simplesmente clicar no link não funciona. Só em casa mesmo pra ver essas coisas. Mas valeu a dica!