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