Duvidas em Expressões Regulares com Java?

10 respostas
java
R

Estou estudando ER e gostaria de saber como resolvo o seguinte problema: um programa com sentenças de modo que o numero de simbolos “a” seja par, e o ultimo simbolo seja “b”.
Exemplo: aab, aaaab, aaaaaaaab etc.

Estou usando o seguinte código, mas ele só da cadeia rejeitada. Nenhuma é aceita:

import java.util.*;
import java.io.*;
public class Sentencas_ultimo_b_a_par{

	private static String s;

	private static int p;
	
	private static boolean xp(String c){
		return(s.substring(p,p+1).equals(c));
	}

	private static boolean np() {
		p++;
		return(true);
	}

	private static void ler_cadeia() {
		p = 0;
		System.out.print ("===============================================================");
		System.out.print ("\nReconhece cadeias que terminam com b, e a sendo pares");
		System.out.print ("\nUse '@' no final para finalizar "); 
		System.out.print ("\n===============================================================");
		Scanner scan = new Scanner(System.in);
		System.out.print ("\nCadeia (formato xxx@): "); 
    	s = scan.nextLine();
	}


	public static void main(String args[]){
		String fim = "@";
		
		ler_cadeia();

		if(xp("b") && np()){
			if(xp("a") && np());
		}
		while(xp("b") && np()){
			if(xp("a") && np());
		}

		if (xp(fim)){
			System.out.println("cadeia ACEITA! \n");
		}else{
			System.out.println("cadeia REJEITADA! \n");
		}
	}
}

10 Respostas

A

A resposta em js (pq é mais simples fazer no console do browser), mas em java é a mesma coisa:

"aaaaaab".match(/^(aa)+b$/)

O ^ e $ pra garantir o início e fim da palavra, o sinal + indica que o valor tem que ser repetido uma ou mais vezes, e nesse caso o valor é o grupo (aa), ou seja, um par de letras a. Por último o b sozinho.

R

Obrigado, de antemão.
Tentei adaptar o codigo, mas não consegui. Onde eu colocaria esse código dentro do meu?

A

Você diz estar estudando ER, mas nao tem nenhuma no seu código. Você está fazendo o parse da string “na mao”, o que seria justamente onde você usaria a ER.

Toda string tem um método matches, que você usa como mostrado no exemplo acima. A única diferença é que você trocaria as barras por aspas.

R

Obrigado, mas não funcionou. Sempre retorna true, qualquer q seja o valor. aaab, ab, aaaaab, por exemplo, deveria ser false, aab, aaaab, aaaaaab etc deveria retornar true.

A

Posta aqui como ficou o código que sempre retorna true.

R

Eu adaptei o código pra armazenar na variável “s” (scan) o q for digitado pelo usuário, e usar essa variavel pra encontrar a expressão q case com as regras mencionadas(a par ultimo b impar):

/*
 Construa e implemente em uma linguagem de programação à sua escolha um AFD M que aceite:
 C) todas as sentenças de (a, b)* de modo que o último símbolo seja “b” e o número de símbolos “a” seja par.
 */


import java.util.*;
import java.io.*;
public class Sentencas_ultimo_b_a_par{

	private static String s;

	private static int p;
	
	private static boolean xp(String c){
		return(s.substring(p,p+1).equals(c));
	}

	private static boolean np() {
		p++;
		return(true);
	}


	private static void ler_cadeia() {
		p = 0;
		Scanner scan = new Scanner(System.in);
		System.out.print ("\nCadeia a inserir(#para final): "); 
    	s = scan.nextLine();
	}


	public static void main(String args[]){
		String fim = "#";
		
		ler_cadeia();

		if(xp("b") && np()){
			if(xp("a") && np());
		}
		while(xp("b") && np()){
			if(xp("a") && np());
		}

		if (xp(fim)){
			System.out.println("Processados os símbolos da fita, estado final com cadeia ACEITA! \n");
			
		}else{	

			System.out.println("Processados os símbolos da fita, estado final com cadeia REJEITADA! \n");
			System.out.println(s.matches("^(aa)+b$"));

		}
	}
}
A

Por que você manteve essas chamadas a xp e np? Qual é a funçao deles?

Procure sempre usar nomes claros para seus métodos, assim quem ler consegue entender o que está acontecendo.

Eu copie e colei o código que postou aqui e ele imprime false quando o número de a é impar e true se o número de a é par… nao tá acontecendo isso pra você?

R

Ok, foi mal, as outras variaveis não têm sentido agora, pois tava tentando adaptar
So esta retornando false em qualquer caso. Vc testou nesse mesmo codigo q mandei ou fez al guma alteração pra retornar true e false?

A

Mesmo código… que versao de java tá usando?

R

java version "1.7.0_80"
Java™ SE Runtime Environment (build 1.7.0_80-b15)

Eclipse com Ubuntu

Criado 23 de maio de 2017
Ultima resposta 25 de mai. de 2017
Respostas 10
Participantes 2