Varias regex num loop

8 respostas
G

Pois é galera, estou tentando ler um array de String onde eu determino um padrao para inicio e outro para fim, e neste intervalo de inicio e fim preciso criar um novo sub-array.
Tentei este codigo, mas o retorno so funciona para a primeira ocorrencia. alguem tem alguma dica ou solução?

package estudos;

import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JOptionPane;

public class Estudos
{

    public static void main(String[] args) throws IOException 
    {
        
        int i =0, tf = 0;
        Integer in = 1, f = 3;
        String[] x = {"1","2","3","4","5","6","7","8","9","0","1","2","3","4","5","6","7","8","9","0","1","2","3","4","5","6","7","8","9","0","1","2","3","4","5","6","7","8","9","0"};
        String[] y = null;
        Pattern pat1 = Pattern.compile(in.toString());
        Matcher mat1 = pat1.matcher(x[i]);
        Pattern pat2 = Pattern.compile(f.toString());
        Matcher mat2 = pat2.matcher(x[i]);
        boolean add =false;
        do
        {
            System.out.println("inicio: "+x[i]+"("+i+") "+mat1.find());
            System.out.println(   "fim: "+x[i]+"("+i+") "+mat2.find());
            if(mat1.find())
            {
                add = true;
                y = null;
                y = new String[x.length];
                y[tf]=x[i];
                tf++;
            }
            if(mat2.find())
            {
                add = false;
                y[tf]=x[i];
                tf++;
                
                mat2 = pat2.matcher(x[i]);
            }
            if(add)
            {
                y[tf]
                        =x[i];
                tf++;
                if(f<10)f++;
               pat2.compile(f.toString());
               mat2.usePattern(pat2);
            }
            i++;
        }
        while(i<x.length);
    }
}
>

8 Respostas

rmendes08

Cara, ao invés de usar Pattern e Matcher, tente reescrever seu algoritmo com o método String.matches( regex ), por exemplo:

if( "1547".matches("[0-9]+") ){
   System.out.println("É número!");
}

eu sei que o desempenho de matches é pior, mas é só pra deixar sua idéia mais clara …

G

Pois é , foi minha primeira tentativa. O problema é que tenho q estar atualizando a o padrao a cada vez q o Matcher fim é true.

rmendes08

Ué, se você tem que ficar alterando o padrão a cada iteração então ai mesmo que você tem que usar o matches. O conjunto Pattern, Matcher serve justamente para melhorar o desempenho para casos em que você tem que confrontar várias Strings para o mesmo padrão. Se a cada iteração você tem que alterar a expressão regular que você está comparando, então não há ganho em um usar Pattern, só servirá para complicar o código.

G

Interessante. Vou tentar fazer uma gambiarra aki e ver se funciona. Vlw pela dica

rmendes08

hmmm … agora me ocorreu, pelo que eu vi, os padrões são simples … porque você não faz uma comparação simples, com equals() mesmo ? porque se for para comparar se um dígito é igual a outro você não precisa de regex.

G

na verdade esse é soh um exemplo da extrutura q eu estou tentando extrair o padrao. eu estou mexendo com pdf onde o livro tem umas 1000 paginas. achei melhor simplificar do q colocar o codigo todo e ninguem entender direito

rmendes08

Uma coisa te garanto, vai ser muito mais fácil se souber descrever o problema por completo. Ninguém vai conseguir olhar o seu código e a partir dele descobrir o que ele tem que fazer, ainda mais se ela não está funcionando. Até agora, a única coisa que eu entendi é que você tem um array de Strings e duas regex, uma demarcando o início e outra demarcando o final, e partir disso você tem que montar um subarray com o que tem entre essas Strings, correto ?

G

Em síntese é isto mesmo. Pelo q reparei, o problema esta no matcher, pois a expressao regular esta funcionando. testei em varios testadores. Mas vamos ao que eu estou fazendo: eu preciso encontrar a palavra “CAPITULO 1”(representado pelo matcher inicio) no texto. até que nao encontre o proximo “Capitulo 2”(representado pelo matcher fim) sera adicionado ao array. e quando eu encontrar o dou um String.split(fim.pattern) para dividir. obs: o pdf foi dividido entre pontos. ou seja a cada ocorrencia de ponto no texto, este texto é adicionado ao array.

Criado 29 de janeiro de 2013
Ultima resposta 29 de jan. de 2013
Respostas 8
Participantes 2