Ajuda num regex

13 respostas
xandevieira

Busquei informações no google sobre regex, mas não consegui entender.
Preciso criar um regex para pegar somente o valor que estiver entre o “=” e a primeira ocorrência de “/”.
Mas a minha string pode vir das maneiras a seguir:

Sendo que na primeira e segunda o valor desejado será 43789.
A última somente o 43789_1.

O que vem antes do “=” irá variar, mas não me interessa o valor.

Alguém pode me ajudar?

13 Respostas

Rodrigo_Sasaki

acho que seus casos são muito diferentes, cara…

tem que definir alguns padrões, como

  • sempre começa com ‘=’
  • sempre termina na primeira ocorrencia de ‘/’

porque senão a regex vai casar com mais do que devia, ou com menos.

William_Ricardo

E se fazer um regex de três grupos ?

public void Regex() {
		String s = "43789/32/1=43789/32/1"; 
		String ss = "43789/32/1"; 
		String sss = "43789"; 
		String ssss = "43789_1=43789_1"; 
		
		Pattern p = Pattern.compile("(=)?([0-9]*)(/)?");
		Matcher m = p.matcher(ssss);
		
		if (m.find()) {
			System.out.println(m.group(2));
		}
	}
Rodrigo_Sasaki

William Ricardo:
E se fazer um regex de três grupos ?

public void Regex() {
		String s = "43789/32/1=43789/32/1"; 
		String ss = "43789/32/1"; 
		String sss = "43789"; 
		String ssss = "43789_1=43789_1"; 
		
		Pattern p = Pattern.compile("(=)?([0-9]*)(/)?");
		Matcher m = p.matcher(ssss);
		
		if (m.find()) {
			System.out.println(m.group(2));
		}
	}

Testei aqui e tá tranquilo (:

Quase la, no primeiro e no último caso, você está imprimindo o primeiro ‘43789’ que vem antes do ‘=’, não o que vem depois

William_Ricardo

digaoneves:
acho que seus casos são muito diferentes, cara…

tem que definir alguns padrões, como

  • sempre começa com ‘=’
  • sempre termina na primeira ocorrencia de ‘/’

porque senão a regex vai casar com mais do que devia, ou com menos.

Concordo.
Fica dificil fazer um padrão quando não há padrão. :?

WRYEL

de todos lugares que já mechi com regex, o do java é o que sempre me dá mais trabalho, testa ai e ve se funciona pra você:

Pattern pattern = Pattern.compile(".*=([^/]+).*", Pattern.DOTALL);
		
		String a = "43789/32/1=43789/32/1";
		String b = "43789/32/1";
		String c = "43789";
		String d = "43789_1=43789_1";
		
		Matcher matcher_a = pattern.matcher(a);
		Matcher matcher_b = pattern.matcher(b);
		Matcher matcher_c = pattern.matcher(c);
		Matcher matcher_d = pattern.matcher(d);
		
		System.out.println(matcher_a.matches() ? matcher_a.group(1) : "");
		System.out.println(matcher_b.matches() ? matcher_b.group(1) : "");
		System.out.println(matcher_c.matches() ? matcher_c.group(1) : "");
		System.out.println(matcher_d.matches() ? matcher_d.group(1) : "");

saida:

43789

43789_1

[]'s

edit: se você quiser pegar um espaço em branco “” sempre que vier =/ você troca o + pelo *

F

no exemplo…

String s = "43789/32/1=43789/32/1"; 
String s = "43789/32/1"; 
String s = "43789"; 
String s = "43789_1=43789_1";

s.substring(0, 4);

não resolve?

edit: removendo paranteses que sobrou.

Rodrigo_Sasaki

filipechaves:
no exemplo…

String s = "43789/32/1=43789/32/1"; 
String s = "43789/32/1"; 
String s = "43789"; 
String s = "43789_1=43789_1";

s.substring(0, 4);

não resolve?

edit: removendo paranteses que sobrou.


Não entendi, cara. Resolve o que?
você nunca vai chegar depois do ‘=’ com s.substring(0,4)

F

unico padrão dessas strings, são os 5 primeiros iguais…

mas eu realmente entendi enrrado a pergunta.

CyberX

Just to help.

Não é das melhores soluções mas estou postando uma solução que ainda contem alguns problemas
mas acho que esse pode ser o caminho. Creio que se melhorar o regex vai funcionar belezinha.

public static void main(String[] args) {
		// Criado array para não repetir condição de replace
		args = new String[4];
		args[0]  = "43789/32/1=43789/32/1";
		args[1]  = "43789/32/1";
		args[2]  = "43789";
		args[3]  = "43789_1=43789_1";
		
		String cond1 = ".*=(\\d*_?\\d*).*";
		String cond2 = "(\\d*).*";
		String r;
		
		StringBuffer sb = new StringBuffer();
		
		for (int i = 0; i < args.length; i++) {
			
			if(args[i].matches(cond1)){
				
				r = args[i].replaceAll(cond1, "$1");
				sb.append(r + "\n");
				
			}else if (args[i].matches(cond2)) {
				
				r = args[i].replaceAll(cond2, "$1");
				sb.append(r +"\n");
			}
		}
		System.out.println(sb.toString());
	}

Flws.

F

Dá pra fazer na gambiarrex tb. :smiley:
Algo do tipo. hehehehe

if (s.contains("=") && s.contains("/")) {
            s = s.substring(s.indexOf("=") + 1, s.length());
            s = s.substring(0, s.indexOf("/"));
        } else if (s.contains("=")) {
            if (s.contains("/")) {
                s = s.substring(s.indexOf("=") + 1, s.indexOf("/"));
            } else {
                s = s.substring(s.indexOf("=") + 1, s.length());
            }
        } else {
            if (s.contains("/")) {
                s = s.substring(0, s.indexOf("/"));
            }
        }
CyberX

Creio que gambiarra não seria uma solução plausível. Regex seria mais fácil de visualizar e entender.
Mas toda tentativa é válida.

Flus.

William_Ricardo

avsouza:
Busquei informações no google sobre regex, mas não consegui entender.
Preciso criar um regex para pegar somente o valor que estiver entre o “=” e a primeira ocorrência de “/”.
Mas a minha string pode vir das maneiras a seguir:

O sinal de igualdade precisa ocorrer para chegar a um resultado.

Logo…

String s = "43789/32/1"; String s = "43789";

não retornaria nada, segundo a lógica…

xandevieira

WRYEL:
de todos lugares que já mechi com regex, o do java é o que sempre me dá mais trabalho, testa ai e ve se funciona pra você:

Pattern pattern = Pattern.compile(".*=([^/]+).*", Pattern.DOTALL);
		
		String a = "43789/32/1=43789/32/1";
		String b = "43789/32/1";
		String c = "43789";
		String d = "43789_1=43789_1";
		
		Matcher matcher_a = pattern.matcher(a);
		Matcher matcher_b = pattern.matcher(b);
		Matcher matcher_c = pattern.matcher(c);
		Matcher matcher_d = pattern.matcher(d);
		
		System.out.println(matcher_a.matches() ? matcher_a.group(1) : "");
		System.out.println(matcher_b.matches() ? matcher_b.group(1) : "");
		System.out.println(matcher_c.matches() ? matcher_c.group(1) : "");
		System.out.println(matcher_d.matches() ? matcher_d.group(1) : "");

saida:

43789

43789_1

[]'s

edit: se você quiser pegar um espaço em branco “” sempre que vier =/ você troca o + pelo *

Verificando melhor minha regra de negócio, não precisarei me preocupar com strings deste jeito, pois terei uma outra string de controle que indicará a origem, dependendo qual será impresso vazio.
Funcionou assim:

"([^/]+).*"

Obrigado a todos.

Criado 30 de maio de 2012
Ultima resposta 31 de mai. de 2012
Respostas 13
Participantes 7