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: 199Me 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
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 cadenagetHouseName:\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 5La 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