Expressão Regular: Recortando Texto

8 respostas
linuxlive

Galera, já faz alguns dias que estou montando expressões regulares, pois estou mechendo com manipulação de arquivos.

Estou precisando acessar um arquivo, recortar uma linha, e dessa linha fazer um novo recorte.

Segue o texto(Script):

#
# Altera o Layout de teclado
#
# Usage: layoutmap.sh
#***********************************************************************
#
MAPA="setxkbmap -layout br -model abnt2"
VER=${MAPA:18:2}

# Altera modelo teclado
if [ $VER = "abnt2" ]; then
     # Padrao Americano
       $MAPA
     # Desabilita repeticao de teclas do X
       xset r off
else
     # Padrao Brasileiro
       $MAPA
       xset r on
fi

Preciso em apenas uma expressão regular, recortar a linha:
MAPA=“setxkbmap -layout br -model abnt2”

e dela recortar apenas o br, ou seja, tudo que estiver depois de -layout e antes de -model.

Já consegui fazer uma expressao para recortar a linha: MAPA=.+ e outra para recortar somente o texto da linha: [^-layout].s[^-model], agora preciso juntar essas duas, e ta complicado.

Espero que alguem consiga me ajudar.
Eu utilizo o site http://regex.powertoy.org/ para validar.

Obrigado

8 Respostas

T

Normalmente eu faria assim:

Pattern pat = Pattern.compile ("-layout (\\w\\w) -model");
Matcher mat = pat.matcher ("MAPA=\"setxkbmap -layout br -model abnt2\"  ");
if (mat.find()) {
    System.out.println (mat.group ()); // imprime "br"
}
linuxlive

Entao, mas no caso, eu preciso recortar esta linha, pois ela varia, ou seja, tenho vários modelos de teclado.

Por exemplo:

MAPA=“setxkbmap -layout us -model pc102”

Entao não posso passar nada fixo, mas sim, preciso recortar tudo que vem depois de -layout e antes de -model.

T

Mas o que você quer fazer? Dê um exemplo de uma entrada e uma saída.

Uma entrada é :

MAPA=“setxkbmap -layout br -model abnt2”

E uma saída?

linuxlive

Na saida, vou alterar essa linha para:

MAPA=“setxkbmap -layout us -model pc102”

Ou tambem, posso ter algum script com o padrao us de entrada, e vou ter que modificar a saida para br.

T

Ah, então você quer parecido com:

sed -e "s/-layout br/-layout us/g" < entrada > saida

?

Dica: você é um linux-man, provavelmente deveria estudar mais aquelas ferramentas que os bons linuxeiros apreciam, como o sed, o awk e o perl.

linuxlive

hehehe, é exatamte isso que quero, mas preciso montar apenas com expressão regular.

Esse esquema que estou montando em java, eu já tenho todo em shell script, e com certeza, usando o sed, awk, etc …

Não posso passar comandos do linux diretamente, pois tenho arquivos .bat para mesma função, para o windows.

Então só preciso juntar as 2 expressões regulares que já montei… Esse esta sendo o trampo… ta complicado.

T
String s = "MAPA=\"setxkbmap -layout br -model abnt2\"";
s = s.replace ("-layout br", "-layout us");

Ainda não entendi qual é a dificuldade.

linuxlive

A dificuldade é que eu não sei o que vai ter nessa linha:

String s = "MAPA=\"setxkbmap -layout br -model abnt2\"";

Por isso não posso passar ela fixa no código…

Algumas possibilidades:

MAPA=“setxkbmap -layout br -model abnt2”
MAPA=“setxkbmap -layout br -model abnt”
MAPA=“setxkbmap -layout us -model abnt”
MAPA=“setxkbmap -layout us -model pc102”

e por ai vai…tem muitos layouts de teclado.

Hoje, fiz funcionar com os dois métodos abaixo:

private String recortaLinha() {
		String retornaLayout = "";
		try {
			String conteudoTeclado = getArqUtil().carregarArquivo(new File(getDirSo().getLTeclado()));
			retornaLayout = Regex.getlocalizaTexto("MAPA=.+", conteudoTeclado);
		} catch (Exception e) {
			// TODO: handle exception
		}
		return retornaLayout;
	}
	
	private String retornaValorLayout() {	
		try {
			String teste = Regex.getlocalizaTexto("[^-layout].s[^-model]", recortaLinha());
			System.out.println(teste);
		} catch (Exception e) {
			// TODO: handle exception
		}

		return null;
		
	}

Primeiro eu recorto a linha do texto (recortaLinha()), depois eu recorto os caracteres que eu preciso (não sei quais são) desse método.
Não sei o que virá entre -layout e -model …

Deu pra entender?

Criado 25 de maio de 2009
Ultima resposta 25 de mai. de 2009
Respostas 8
Participantes 2