Regex

6 respostas
felixcomputer

Pessoal, to com uma duvida, tenho a seguinte String:

<td><strong>Submitted By:</strong><br />Jodi Showers(<tt><a href="/users/jodishowers">jodishowers</a></tt>)</td>

Só que ela também pode ser assim(sem o link) :

<td><strong>Submitted By:</strong><br />David Chelimsky (dchelimsky)</td>

Ae eu pensei em colocar o link antes do nome como opcional, tipo assim:

String regex = "<td><strong>Submitted By:</strong><br /(?si)>(?:.*?)\([<tt><a href=(?:.*?)>]?(.*?)[</a></tt>]?\)</td> ";

Mas naum funcionou, ela pega tudo, esse é o retorno:

Aslak Hellesøy				(<tt><a href="/users/aslak_hellesoy">aslak_hellesoy</a></tt>)

Alguem consegue ver aonde eu to errando?
obrigado

6 Respostas

gwoliveira

Samuel, ficou um pouco confusa sua pergunta, mas vamos ver se entendi vc quer pegar o nome que acredito ser do usuario o que esta entre parenteses, se for a expressao é esta:

<td><strong>Submitted By:</strong><br /(?si)>(?:.*?)\((?:<tt><a href=(?:.*?)>)?(.*?)(?:</a></tt>)?\)</td>

no caso seu erro foi usar uma lista [ ] ao invez de usar um grupo nao capturavel (?: )

Att

Guilherme

felixcomputer

Olá, primeiramente, muito obrigado pela sua ajuda :slight_smile:

A minha duvida era que poderia ter duas entradas diferentes, olhe no exemplo abaixo
Agora, eu testei o que vc mandou e continua pegando a msm coisa para a primeira entrada, para a entrada com o link ele lançou exceção

Um pequeno teste:

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

public class Teste {

	public static void main(String[] args) {
		String entrada = "<td><strong>Submitted By:</strong><br />Aslak Hellesøy (aslak_hellesoy)</td>";
		String entrada2 = "<td><strong>Submitted By:</strong><br />Jodi Showers(<tt><a href=\"/users/jodishowers\">jodishowers</a></tt>)";
		Pattern pattern = Pattern
				.compile("<td><strong>Submitted By:</strong><br /(?si)>(?:.*?)((?:<tt><a href=(?:.*?)>)?(.*?)(?:</a></tt>)?)</td>");
		Matcher matcher = pattern.matcher(entrada);
		Matcher m = pattern.matcher(entrada2);
		if (matcher.find()) {
			System.out.println(matcher.group(1));
			System.out.println(m.group(1));
		}
	}
}

Eu uso a expressão num properties e quando eu queria especificar um caracter ‘(’ eu colocava a barra ‘(’. Naum sei se ta certo, mas quando eu testei a regex direto, o eclipse apontou um erro dizendo que era um caractere de escape invalido, entaum eu removi ele da regex, no entando a saida do programa ficou assim:

Aslak Hellesøy (aslak_hellesoy)
Exception in thread "main" java.lang.IllegalStateException: No match found
	at java.util.regex.Matcher.group(Matcher.java:468)
	at java.util.regex.Matcher.group(Matcher.java:428)
	at br.ufpa.di.connectoss.core.Teste.main(Teste.java:17)

Vc poderia testar ae?
Obrigado

balieiro

Fala Samuel, eu acho que o que o sr. estah tentando fazer é reconhecer os dois tipos de entrada com a mesma expressão. Para isso, o sr. deve tentar utilizar a primeira expressao, porem mudando o modo de operacao do pattern de EAGER para GREEDY. Espero que tenha ajudado e que funcione, pois eu naum testei (estou meio atrasado).

Abraço. :smiley:

felixcomputer

Obrigado marco, mas como seria isso, eu li o site e la falava de quantificadores gulosos, relutantes e possessivos, mas naum de eager, podes dar um exemplo?

balieiro

Fala Samuel, acho que a regex que vc tah procurando é essa:

Pattern.compile("<td><strong>Submitted By:</strong><br /(?si)>(?:.*?)\Q(\E(?:<tt><a href=.*?>)?(.*?)(?:</a></tt>)?\Q)\E</td>");

Espero que funcione, abraço.

felixcomputer

Isso mesmo Marco, valeu!!

Criado 16 de maio de 2007
Ultima resposta 23 de mai. de 2007
Respostas 6
Participantes 3