В настоящее время я работаю над тем, что код вводит около тысячи строк строк. Каждая строка должна соответствовать определенному формату, например:

"Имя,#,#,#,#,#,#"

Где «имя» - это название фильма (мы можем предположить, что в имени не будет никаких цифр), а «#» - любое число от 0 до 10. Каждое значение ДОЛЖНО быть разделено запятой.

Мой код:

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);

Проблема в том, что в названии фильма не должно быть запятых. Если это так, его нужно распечатать. Тем не менее, мой 'match ()', кажется, не принимает строки, в названии которых есть запятая. Мне кажется, что в моем коде конкретно указано, что если следующая запись (разделенная запятой) не является целым числом, то она не совпадает, и поэтому необходимо печатать «строку».

Кто-нибудь может увидеть, где я иду не так в этом?

0
rexorsist 27 Фев 2018 в 01:53

3 ответа

Если вы решите эту проблему с помощью регулярных выражений, я бы рекомендовал использовать запятые в части «Имя» вашего регулярного выражения. Сосредоточьтесь на том, чтобы убедиться, что есть 6 чисел, каждое после запятой. Вы можете проверить, соответствует ли имя соответствующим критериям позже.

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 Фев 2018 в 23:22

Следующее регулярное выражение должно решить вашу проблему:

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

Или более короткая версия, без дублирования кода:

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

< Сильный > Тестирование

«Убийца 6,7,3,6,8,1» соответствует шаблону.

"Убийство, 6,7,3,6,8,1" не соответствует шаблону, как вы хотели.

Кроме того, пробелы в заголовке поддерживаются.

Вы можете поиграть с ним здесь.

0
SHG 26 Фев 2018 в 23:38

Проблема заключается в .*. Эта часть может включать запятую.

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

Итак, в основном вам нужно всего лишь избавиться от .*. Вместо этого примените квантификатор к вашей первой группе:

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

Или

[a-zA-Z]+ // to match at least one character
0
Izruo 26 Фев 2018 в 23:14