Foros del Web » Programación para mayores de 30 ;) » Java »

duda con pattern y matcher

Estas en el tema de duda con pattern y matcher en el foro de Java en Foros del Web. Hola a todos, tengo una duda y espero que me puedan ayudar o por lo menos decirme como salir del bache, tengo un texto metido ...
  #1 (permalink)  
Antiguo 04/06/2013, 02:43
 
Fecha de Ingreso: marzo-2011
Mensajes: 226
Antigüedad: 13 años, 1 mes
Puntos: 1
duda con pattern y matcher

Hola a todos,

tengo una duda y espero que me puedan ayudar o por lo menos decirme como salir del bache, tengo un texto metido en una variable mas o menos de este estilo:

ADMINISTRACIÓN GENERAL:

– MINISTERIO DE EMPLEO
Servicio Público Estatal:

Remisión de resolución de percepción indebida
de la Activa de Inserción....................... 2
Remisión de resolución de percepción indebida
del Sub ........................... 2
Remisión de resolución de percepción indebida
del Sub........................... 3
Remisión de resolución de percepción indebida
del Subsidio ........................... 3


– MINISTERIO DE ALIMENTACIÓN
Y MEDIO AMBIENTE
Confederación Hidrográfica:

Iniciación derecho a un aprovechamiento de aguas....... 4


ADMINISTRACIÓN PROVINCIAL:

.......
.......
...

--------+++++---------------+++++++++++---------------++++++++--------

bien lo que tengo que hacer es sacar los titulos los cuales son los que aparecen en mayuscula seguido de dos puntos, la unica idea que se me ocurre es utilizar la clase pattern y matcher para buscar mediante expresiones regulares de tal forma que busque las dos ultimas letras mayusculas seguido de dos puntos, hasta aqui no hay problema, la duda me surge de como poder hacer para que a medida que busque pueda ir almacenando los titulos, es decir, mientras no encuentre el patron que vaya guardando las palabras que estan antes de la expresion regular, lo hice de la siguiente manera pero solo me guarda las coincidencias con el patron, espero que me podais ayudar, o si sabeis una forma mejor de hacerlo o mas facil tambien me vendria bien saberlo

Código Java:
Ver original
  1.        
  2. Pattern p = Pattern.compile("[A-Z][A-Z]:");
  3. Matcher m = p.matcher(toString);
  4.        
  5.        
  6.        
  7.         for (int i = 0; i < toString.length(); i++) {
  8.        
  9.             sb.insert( sb.length() , toString.charAt(i) );
  10.            
  11.              if ( m.find() ) {
  12.                  
  13.                  sb.insert(sb.length() , m.group());
  14.                  
  15.                  System.out.println(sb.toString() );
  16.              }   
  17.         }

yo creo el que problema lo tengo en el char.At(i) que solo me pasa un caracter


espero que me podais ayudar

gracias
  #2 (permalink)  
Antiguo 04/06/2013, 02:44
 
Fecha de Ingreso: marzo-2011
Mensajes: 226
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: duda con pattern y matcher

Gracias de antemano
  #3 (permalink)  
Antiguo 04/06/2013, 05:23
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: duda con pattern y matcher

¿Y cuál es el objetivo?

No sé que quieres hacer, ¿pero no te sirve con hacer un split por guión, y después cortar por los dos puntos?
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #4 (permalink)  
Antiguo 04/06/2013, 05:46
 
Fecha de Ingreso: marzo-2011
Mensajes: 226
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: duda con pattern y matcher

necesito obtener primero lo que hay antes de los dos puntos, y luego obtener a continuacion el subtitulo que es lo que esta despues del guion, necesito almacenarlo todo junto en lugar de en posiciones diferentes del array que es lo que hace si utilizo split
  #5 (permalink)  
Antiguo 04/06/2013, 05:49
 
Fecha de Ingreso: marzo-2011
Mensajes: 226
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: duda con pattern y matcher

es decir necesitaria que me quedara mas o menos de esta manera:

titulo: ADMINISTRACIÓN GENERAL
subtitulo: MINISTERIO DE EMPLEO
entradas:
Servicio Público Estatal:

Remisión de resolución de percepción indebida
de la Activa de Inserción....................... 2
Remisión de resolución de percepción indebida
del Sub ........................... 2
Remisión de resolución de percepción indebida
del Sub........................... 3
Remisión de resolución de percepción indebida
del Subsidio ........................... 3
  #6 (permalink)  
Antiguo 04/06/2013, 05:51
 
Fecha de Ingreso: marzo-2011
Mensajes: 226
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: duda con pattern y matcher

y necesitaria obtener para cada entrada el numero, proble con split pero me corta el numero y no me lo muestra, tambien probe a cortar por los puntos con split y entonces en cada posicion del array me guarda la entrada sin el numero, el numero me lo pasa a la siguiente posicion del array
  #7 (permalink)  
Antiguo 04/06/2013, 08:01
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: duda con pattern y matcher

Para empezar, ¿el texto que recibes tiene esos saltos de línea?¿La única línea que empieza por - es la del subtítulo?¿No hay más :?

Si te dijera que hagas un programa que interprete correctamente (respetando los \n)

Cita:
- Ministerio
de empleo
Servicio público:
Cita:
- Ministerio de empleo
Servicio público:
Cita:
- Ministerio de empleo
Servicio
público:
no podrías, pues eso es lo que tienes en tus ejemplos.

– MINISTERIO DE EMPLEO
Servicio Público Estatal

– MINISTERIO DE ALIMENTACIÓN
Y MEDIO AMBIENTE
Confederación Hidrográfica:

Revisa primero todos los posibles casos que te pueden llegar, después podrás plantearte si usar regex o qué hacer.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #8 (permalink)  
Antiguo 04/06/2013, 08:15
 
Fecha de Ingreso: marzo-2011
Mensajes: 226
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: duda con pattern y matcher

si, el texto que recibo tiene todos esos saltos de linea, verás el tema es que ese texto lo leo de un pdf con la libreria pdftextstream. en el pdf aparecen los titulos en subrayado, los subtitulos en negrita y las entradas en cursiva, lo malo es que cuando la libreria recoge el texto lo saca todo por igual, lo unico que mantiene son los saltos de linea.

con respecto a tu otra pregunta, si, en el texto aparecen otras lineas con - pero las lineas en las que aparezca - corresponden a subtitulos
  #9 (permalink)  
Antiguo 04/06/2013, 12:09
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: duda con pattern y matcher

Lee línea a línea.

Línea que acaba en :, es un título
Línea que empiece en guión y sucesivas hasta que encuentres una línea que acaba en :, subtítulo. Evidentemente la línea que contiene los : no forma parte del subtítulo, es la primera de entradas, y tienes que tener en cuenta que línea acabada en : que no sigue a un subtitulo no es una línea.

Esto no te soluciona los casos que te he dicho, puedes añadir condiciones como que todas las letras estén en mayúsculas o controlar cuantos saltos de línea hay, pero poco más se puede hacer.

O estudia mejor esa librería o busca otra para conseguir los datos de formato.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #10 (permalink)  
Antiguo 05/06/2013, 01:59
 
Fecha de Ingreso: marzo-2011
Mensajes: 226
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: duda con pattern y matcher

para leer linea a linea deberia de guardar en un fichero de texto el texto y luego leer el fichero linea a linea no? o lo puedo hacer cortando con split por "\n" ?

luego otra pregunta como hacer para ir copiando hasta encontrar tal caracter? probe a ir leyendo caracter a caracter con charAt(int) e ir copiando pero no funciona todo lo bien que desearia, puede haber otra forma?
  #11 (permalink)  
Antiguo 05/06/2013, 02:46
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: duda con pattern y matcher

Pues depende del origen de tus datos, pero sí, si tienes una String con todo el texto puedes hacer un split con el salto de línea y tendrías un array con todas las líneas.

Para ver por qué empieza una línea o termina tienes la API de String

http://docs.oracle.com/javase/6/docs...ng/String.html

Y una línea no puede pertenecer a dos partes, así que tienes que analizar línea a línea, no por caracteres.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #12 (permalink)  
Antiguo 06/06/2013, 02:22
 
Fecha de Ingreso: marzo-2011
Mensajes: 226
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: duda con pattern y matcher

indagando mas sobre la clase y ojeando problemas que les ocurrieron a otras personas consegui poder extraer el texto sin espacios en blanco. el problema sigue siendo que de vez en cuando una frase que deberia estar en una linea aparece en subdividida en dos es decir asi:

-NOTIFICACIÓN EXPEDIENTES SANCIONADORES DE LA
DIRECCIÓN GENERAL DE LA MARINA MERCANTE 4


luego otra pregunta

probe con endsWith() para saber como acaba un string y para la linea ;
ADMINISTRACIÓN CENTRAL:

me devuelve false, la verdad no se a que es debido,

puede ser por un problema del caracter dos puntos (:) ??
  #13 (permalink)  
Antiguo 06/06/2013, 02:37
 
Fecha de Ingreso: marzo-2011
Mensajes: 226
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: duda con pattern y matcher

probe con endsWith("CENTRAL") y tambien con endsWith("CENTRAL:") y devuelve FALSE en todos los casos adjunto el codigo por si algo estoy haciendo mal

Código Java:
Ver original
  1. public void DivideTexto(String texto)
  2.     {
  3.         String lineas[];
  4.         String varLine;
  5.         lineas = texto.split("\n");
  6.        
  7.         for ( int i = 0; i < lineas.length; i++ )
  8.         {
  9.             varLine = lineas[i].toString();
  10.            
  11.             if ( varLine.endsWith(":") )
  12.             {
  13.                 System.out.println(lineas[i].toString() );
  14.                 System.out.println("correcto");
  15.             }
  16.             else
  17.             {
  18.                 System.out.println("no es ");
  19.             }
  20.         }
  21.     }
  #14 (permalink)  
Antiguo 06/06/2013, 05:58
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: duda con pattern y matcher

endsWith funciona perfectamente con :

http://ideone.com/ZU03AS

Mira en depuración cómo es la cadena que le estás pasando, quizás después de los : haya un espacio, hazle un trim. También podría ser que los : no sean realmente :, aunque lo dudo.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #15 (permalink)  
Antiguo 06/06/2013, 06:27
 
Fecha de Ingreso: marzo-2011
Mensajes: 226
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: duda con pattern y matcher

pense en la posibilidad de que hubiese un espacio y le hice el trim pero aun asi sigue sin funcionar, intentare probar con lastindexof(.) y con la posicion que me devuelva lo comparo con la longitud del string, que supongo que tambien me valdra no?

Etiquetas: clase, pattern, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:58.