Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

163
Vistas
Java regex analiza secciones de texto largo

Tengo un texto de gran tamaño que puede contener varios nombres de casas y, para cada casa, hay algunos valores específicos para esa casa específica, y así sucesivamente. Aquí hay una parte similar de mi txt:

 getHouseName: house1 random useless text price: 1000 squaremtr: 75 sellVal: 1000 random useless text random useless text random useless text rentPrice: 150 getHouseName: house2 price: 1004 squaremtr: 85 sellVal: 950 random useless text rentPrice: 150 getHouseName: house3 price: 1099 squaremtr: 90 random useless text random useless text sellVal: 1100 random useless text rentPrice: 199

Me gustaría, para cada casa, recuperar valores específicos para cada casa y almacenarlos en una variable usando expresiones regulares. Ahora mismo este es mi código:

 public void testHouse() { Scanner txt = new Scanner(new File("path//to//file")); String houseName =""; String price = ""; String squaremtr = ""; String sellVal = ""; String rentPrice = ""; Pattern houseNamePatt = Pattern.compile("getHouseName: ((_!getHouseName: \\s).)*", Pattern.DOTALL); while(txt.hasNextLine()) { String str = txt.nextLine(); Matcher m = houseNamePatt.matcher(str); if(m.find) { houseName=str.substring(m.end()); System.out.println("houses: " + m.group()); } } }

Pero en este caso solo obtengo una lista con todos los nombres de las casas, no las líneas entre cada nombre y definitivamente no puedo asignar los valores de una casa específica a mis variables. ¿Dónde estoy equivocado? Gracias

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Puede obtener todos los valores haciendo coincidir los nombres seguidos de un grupo de captura. Si hay líneas intermedias con valores aleatorios, puede hacer coincidir todas las líneas que no comiencen con el siguiente valor esperado utilizando una anticipación negativa (?!

Luego establezca los valores de las variables iguales al número de grupo.

 ^getHouseName:\h+(.+)(?:\R(?!price:).*)*\Rprice: (\d+)(?:\R(?!squaremtr:).*)*\Rsquaremtr:\h+(\d+)(?:\R(?!sellVal:).*)*\RsellVal:\h+(\d+)(?:\R(?!rentPrice:).*)*\RrentPrice:\h+(\d+)

En partes:

  • ^ Comienzo de cadena
  • getHouseName:\h+(.+) Coincide con el valor de getHouseName en el grupo 1
  • (?:\R(?!price:).*)*\Rprice: (\d+) coincidir hasta la siguiente línea con price , capture 1+ dígitos en el grupo 2
  • (?:\R(?!squaremtr:).*)*\Rsquaremtr:\h+(\d+) Haga coincidir hasta la siguiente línea con squaremtr , capture 1+ dígitos en el grupo 3
  • (?:\R(?!sellVal:).*)*\RsellVal:\h+(\d+) Haga coincidir hasta la siguiente línea con sellVal , capture 1+ dígitos en el grupo 4
  • (?:\R(?!rentPrice:).*)*\RrentPrice:\h+(\d+) Haga coincidir hasta la siguiente línea con rentPrice , capture 1+ dígitos en el grupo 5

Demostración de expresiones regulares

over 4 years ago · Santiago Trujillo Denunciar

0

La siguiente expresión regular lo hará:

 (?m)^getHouseName: (.*)\\Rprice: (.*)\\Rsquaremtr: (.*)\\RsellVal: (.*)\\RrentPrice: (.*)

Prueba

 String hugeText = "getHouseName: house1\n" + "price: 1000\n" + "squaremtr: 75\n" + "sellVal: 1000\n" + "rentPrice: 150\n" + "getHouseName: house2\n" + "price: 1004\n" + "squaremtr: 85\n" + "sellVal: 950\n" + "rentPrice: 150\n" + "getHouseName: house3\n" + "price: 1099\n" + "squaremtr: 90\n" + "sellVal: 1100\n" + "rentPrice: 199"; String regex = "(?m)^" + "getHouseName: (.*)\\R" + "price: (.*)\\R" + "squaremtr: (.*)\\R" + "sellVal: (.*)\\R" + "rentPrice: (.*)"; for (Matcher m = Pattern.compile(regex).matcher(hugeText); m.find(); ) { String houseName = m.group(1); String price = m.group(2); String squaremtr = m.group(3); String sellVal = m.group(4); String rentPrice = m.group(5); System.out.printf("%-8s %6s %4s %6s %5s%n", houseName, price, squaremtr, sellVal, rentPrice); }

Producción

 house1 1000 75 1000 150 house2 1004 85 950 150 house3 1099 90 1100 199
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda