Actualmente estoy trabajando en algo donde el código ingresa miles de líneas de cadenas. Cada línea debe seguir un formato específico como el siguiente:

"Nombre,#,#,#,#,#,#"

Donde 'nombre' es el nombre de una película (podemos suponer que el nombre no tendrá ningún número), y # es cualquier número del 0-10. Cada valor DEBE estar separado por una coma.

Mi código es el siguiente:

if (line.matches(".*[a-zA-z].*,([0-9]|10),([0-9]|10),([0-9]|10),([0-9]|10),([0-9]|10),([0-9]|10)")) {
       System.out.println("no");
}

else {
    System.out.println(line);

El problema es que el título de la película no puede tener comas. Si lo hace, necesita ser impreso. Sin embargo, mis 'coincidencias ()' no parecen captar líneas que tengan una coma en el título. Me parece que mi código describe específicamente que si la siguiente entrada (separada por una coma) no es un número entero, entonces no coincide y, por lo tanto, la 'línea' debe imprimirse.

¿Alguien puede ver a dónde me estoy equivocando en esto?

0
rexorsist 27 feb. 2018 a las 01:53

3 respuestas

Si usa regex para resolver esto, le recomiendo permitir comas en la parte 'Nombre' de su regex. Concéntrese en asegurarse de que haya 6 números, cada uno después de una coma. Puede verificar si el nombre se ajusta a un criterio apropiado más adelante.

import java.util.regex.Pattern;
import java.util.regex.Matcher;


// before your for-loop, create a pattern (Assuming no digits in title)
Pattern p = Pattern.compile("([^0-9]+),([0-9]|10),([0-9]|10),([0-9]|10),([0-9]|10),([0-9]|10),([0-9]|10)");

// ...
// later on in your actual for-loop for each line.
Matcher m = p.matcher(line);

if (m.matches())
{
    String title = m.group(1);
    // do extra checking for the title if needed
}
else
{
    // print no
}
0
black panda 26 feb. 2018 a las 23:22

La siguiente expresión regular supone resolver su problema:

^([a-zA-Z ]+),([0-9]|10),([0-9]|10),([0-9]|10),([0-9]|10),([0-9]|10),([0-9]|10)

O la versión más corta, sin duplicación de código:

^([a-zA-Z ]+)(,([0-9]|10)){6}

Pruebas

"La Asesina, 6,7,3,6,8,1" coincide con el patrón.

"The Kill, er, 6,7,3,6,8,1" no coincide con el patrón, como querías.

Además, los espacios en el título son compatibles.

Puedes jugar con él aquí.

0
SHG 26 feb. 2018 a las 23:38

El problema radica en el .*. Esta parte puede incluir la coma.

Fri,dayaervsere,6,4,78,7
<--><--------->^
.*  [a-zA-Z]   ,(  [...]

Entonces, básicamente solo necesitas deshacerte de .*. En cambio, aplique un cuantificador a su primer grupo:

[a-zA-Z]* // to match any number of characters

O

[a-zA-Z]+ // to match at least one character
0
Izruo 26 feb. 2018 a las 23:14