Java Split регулярное выражение

По заданной строке S найдите количество слов в этой строке. Для этой задачи слово определяется строкой из одной или нескольких английских букв.

Примечание. Пробел или любой из специальных символов, таких как![,?.\_'@+], Будут действовать как разделитель.

Формат ввода: строка будет содержать только строчные английские буквы, прописные английские буквы, пробелы и следующие специальные символы:![,?._'@+].

Формат вывода: в первой строке выведите количество слов в строке. Слова не должны быть уникальными. Затем напечатайте каждое слово в отдельной строке.

Мой код:

    Scanner sc = new Scanner(System.in);
    String str = sc.nextLine();
    String regex = "( |!|[|,|?|.|_|'|@|+|]|\\\\)+";
    String[] arr = str.split(regex);

    System.out.println(arr.length);

    for(int i = 0; i < arr.length; i++)
        System.out.println(arr[i]);

Когда я отправляю код, он работает чуть более половины тестовых случаев. Я не знаю, что такое тестовые случаи. Я прошу помощи с законом Мерфи. В каких ситуациях введенное мной регулярное выражение не будет работать?

1 ответ

Решение

Вы не можете избежать некоторых специальных символов в своем регулярном выражении. Давайте начнем с [], Так как вы не избежите их, часть [|,|?|.|_|'|@|+|] рассматривается как набор символов |,?._'@+, Это означает, что ваше регулярное выражение не делится на [ а также ],

Например x..]y+[z разделен на x, ]y а также [z,

Вы можете исправить это, убрав этих персонажей. Это заставит вас избегать их, и вы получите правильное определение:

String regex = "( |!|\\[|,|\\?|\\.|_|'|@|\\+|\\])+";

Обратите внимание, что вместо определения альтернатив вы можете использовать набор, который облегчит чтение вашего регулярного выражения:

String regex = "[!\\[,?._'@+\\].]+";

В этом случае вам нужно только сбежать [ а также ],

ОБНОВИТЬ:

Также есть проблема с ведущими специальными символами (как в вашем примере ".Hi?there[broski.]@@@@@"). Вам нужно разделить его, но он выдаст пустую строку в результатах. Я не думаю, что есть способ использовать функцию разделения без ее создания, но вы можете уменьшить ее, удалив первую группу перед разделением с помощью того же регулярного выражения:

String[] arr = str.replaceFirst(regex, "").split(regex);
Другие вопросы по тегам