Montar uma Expressão Regular

5 respostas
S

Amigos preciso montar uma ER que busque a chave por exemplo "0000088C" e que traga tudo que estiver entre as tags e .

Buscando "0000088C" deve retornar apenas:

<Package>
 <Header Reason="0" Id="198" Version="1.0"/>
 <Control Provider="" CPRDateTime="2012/02/08 11:58:32" Account="2" MsgId="211" Port="3000"/>
 <TCA ProductId="22" SerialNumber="0000088C" VersionId="0.1"/>
 <Datagram MsgType="STATE" MsgDateTime="2012/02/08 10:58:29"/>
 <GPS SatNum="8" Speed="68" DateTime="2012/02/08 10:58:28" NorthAngle="293.0" AltitudeStatus="VALID" PosIsValid="TRUE" Lat="-25.54156" Long="-48.68713" CableStatus="OK" Altitude="18"/>
 <Comm RSSI="0" GPSType="INTERNAL"/>
 <LinearInput Speed="0" Odometer="0" RPM="0" Temp1="127" BackBattery="40" Temp2="127" Temp3="127" MainBattery="26"/>
 <Input Movement="ON"/>
 <Output/>
 <Event Movement="ON" EventDateTime="2012/02/08 10:58:28"/>
</Package>

Buscando "0000087C" deve retornar apenas:

<Package>
 <Header Reason="0" Id="198" Version="1.0"/>
 <Control Provider="" CPRDateTime="2012/02/08 11:58:32" Account="2" MsgId="211" Port="3000"/>
 <TCA ProductId="22" SerialNumber="0000087C" VersionId="0.1"/>
 <Datagram MsgType="STATE" MsgDateTime="2012/02/08 10:58:29"/>
 <GPS SatNum="8" Speed="68" DateTime="2012/02/08 10:58:28" NorthAngle="293.0" AltitudeStatus="VALID" PosIsValid="TRUE" Lat="-25.54156" Long="-48.68713" CableStatus="OK" Altitude="18"/>
 <Comm RSSI="0" GPSType="INTERNAL"/>
 <LinearInput Speed="0" Odometer="0" RPM="0" Temp1="127" BackBattery="40" Temp2="127" Temp3="127" MainBattery="26"/>
 <Input Movement="ON"/>
 <Output/>
 <Event Movement="ON" EventDateTime="2012/02/08 10:58:28"/>
</Package>

<Package>
 <Header Reason="0" Id="198" Version="1.0"/>
 <Control Provider="" CPRDateTime="2012/02/08 11:58:32" Account="2" MsgId="211" Port="3000"/>
 <TCA ProductId="22" SerialNumber="0000087C" VersionId="0.1"/>
 <Datagram MsgType="STATE" MsgDateTime="2012/02/08 10:58:29"/>
 <GPS SatNum="8" Speed="68" DateTime="2012/02/08 10:58:28" NorthAngle="293.0" AltitudeStatus="VALID" PosIsValid="TRUE" Lat="-25.54156" Long="-48.68713" CableStatus="OK" Altitude="18"/>
 <Comm RSSI="0" GPSType="INTERNAL"/>
 <LinearInput Speed="0" Odometer="0" RPM="0" Temp1="127" BackBattery="40" Temp2="127" Temp3="127" MainBattery="26"/>
 <Input Movement="ON"/>
 <Output/>
 <Event Movement="ON" EventDateTime="2012/02/08 10:58:28"/>
</Package>
Texto Completo
<Package>
 <Header Reason="0" Id="198" Version="1.0"/>
 <Control Provider="" CPRDateTime="2012/02/08 11:58:32" Account="2" MsgId="211" Port="3000"/>
 <TCA ProductId="22" SerialNumber="0000087C" VersionId="0.1"/>
 <Datagram MsgType="STATE" MsgDateTime="2012/02/08 10:58:29"/>
 <GPS SatNum="8" Speed="68" DateTime="2012/02/08 10:58:28" NorthAngle="293.0" AltitudeStatus="VALID" PosIsValid="TRUE" Lat="-25.54156" Long="-48.68713" CableStatus="OK" Altitude="18"/>
 <Comm RSSI="0" GPSType="INTERNAL"/>
 <LinearInput Speed="0" Odometer="0" RPM="0" Temp1="127" BackBattery="40" Temp2="127" Temp3="127" MainBattery="26"/>
 <Input Movement="ON"/>
 <Output/>
 <Event Movement="ON" EventDateTime="2012/02/08 10:58:28"/>
</Package>

<Package>
 <Header Reason="0" Id="198" Version="1.0"/>
 <Control Provider="" CPRDateTime="2012/02/08 11:58:32" Account="2" MsgId="211" Port="3000"/>
 <TCA ProductId="22" SerialNumber="0000088C" VersionId="0.1"/>
 <Datagram MsgType="STATE" MsgDateTime="2012/02/08 10:58:29"/>
 <GPS SatNum="8" Speed="68" DateTime="2012/02/08 10:58:28" NorthAngle="293.0" AltitudeStatus="VALID" PosIsValid="TRUE" Lat="-25.54156" Long="-48.68713" CableStatus="OK" Altitude="18"/>
 <Comm RSSI="0" GPSType="INTERNAL"/>
 <LinearInput Speed="0" Odometer="0" RPM="0" Temp1="127" BackBattery="40" Temp2="127" Temp3="127" MainBattery="26"/>
 <Input Movement="ON"/>
 <Output/>
 <Event Movement="ON" EventDateTime="2012/02/08 10:58:28"/>
</Package>

<Package>
 <Header Reason="0" Id="198" Version="1.0"/>
 <Control Provider="" CPRDateTime="2012/02/08 11:58:32" Account="2" MsgId="211" Port="3000"/>
 <TCA ProductId="22" SerialNumber="0000087C" VersionId="0.1"/>
 <Datagram MsgType="STATE" MsgDateTime="2012/02/08 10:58:29"/>
 <GPS SatNum="8" Speed="68" DateTime="2012/02/08 10:58:28" NorthAngle="293.0" AltitudeStatus="VALID" PosIsValid="TRUE" Lat="-25.54156" Long="-48.68713" CableStatus="OK" Altitude="18"/>
 <Comm RSSI="0" GPSType="INTERNAL"/>
 <LinearInput Speed="0" Odometer="0" RPM="0" Temp1="127" BackBattery="40" Temp2="127" Temp3="127" MainBattery="26"/>
 <Input Movement="ON"/>
 <Output/>
 <Event Movement="ON" EventDateTime="2012/02/08 10:58:28"/>
</Package>

Alguém consegue montar esta ER, Obrigado!

5 Respostas

Michel_M

Ai amigo vou te dar uma luz

http://www.youtube.com/watch?v=N4Bj-gPS0zQ&feature=BFa&list=PLA03DEA5320ECBF85&lf=plcp

Grd abraço

iuoyo

Eu tinha dificuldades da uma lida nesse livro e ve se fica mais claro!

http://aurelio.net/regex/guia/

dudzjava

Existem varias formas de se fazer esta expressão, mais uma delas seria algo do tipo :

Pattern.matches("0{5}8{2}C", param);

Abs,

S

dudzjava:
Existem varias formas de se fazer esta expressão, mais uma delas seria algo do tipo :

Pattern.matches("0{5}8{2}C", param);

Abs,

Vou dar uma estudada no link que o pessoal passou, esta ER que vc passou somente vai trazer o numero 0000088C, mas não é isso que eu quero, que quero que ele localize o 0000088C e devolva tudo que estiver antes dele até e tudo que estiver depois dele até como no exemplo que passei acima.

S

Amigos consegui progredir um pouco mas estou com uma duvida, no exemplo abaixo com o texto

<Package>
stgt
0008890
gts45
</Package>

<Package>
dsadas
0008891
frgrg
</Package>

<Package>
adsdas
0008890
54534
</Package>

Usando o Código

try {
            BufferedReader buff = new BufferedReader(new FileReader("c:\\MensagemEntrada.log"));
            StringBuilder texto = new StringBuilder();
            String aux;
            while ((aux = buff.readLine()) != null) {
                texto.append(aux);
            }
            buff.close();
            // String er = "<Package>(.|\\s)*00002B90(.|\\s)*(</Package>$|<Package>)";
            String er = "<Package>\\w*0008891\\w*</Package>";
            Matcher m = Pattern.compile(er).matcher(texto.toString());
            List<String> result = new ArrayList<String>();
            while (m.find()) {
                result.add(m.group());
            }
            System.out.println("Size:" + result.size());
            for (String t : result) {
                System.out.println(t);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }

Com a ER "\\w*0008891\\w*" tenho o seguinte resultado:

run:
Size:1
<Package>dsadas0008891frgrg</Package>
CONSTRUÍDO COM SUCESSO (tempo total: 0 segundos)
Este resultado está correto! Mas ao mudar minha ER para ".*0008891.*" é retornado o seguinte:
Size:1
<Package>stgt0008890gts45</Package><Package>dsadas0008891frgrg</Package><Package>adsdas000889054534</Package>

Pergunto a vcs como buscar qualquer caráter entre o valor 0008891 sem influenciar no resultado, pois nas mensagens reais usar somente o \\w não dá tem que ser qualquer carácter antes do 0008891 até o , e qualquer carácter depois do 0008891 até o .

Obrigado!

Criado 8 de fevereiro de 2012
Ultima resposta 9 de fev. de 2012
Respostas 5
Participantes 4