Нужна простая помощь по использованию .split в java - PullRequest
0 голосов
/ 06 мая 2020

У меня есть простой код:

    public static void main(String[] args) {
        String s = "He is a very very good boy, isn't he?"
        String[] words = s.split("[\\s\\-\\.\\'\\?\\,\\_\\@\\!]");
        System.out.println(words.length);
        for(int i = 0; i<words.length; i++) {
            System.out.println(words[i]);
        }
        scan.close();
    }

, который должен выводить мне это:

10
He
is
a
very
very
good
boy
isn
t
he

Но вместо этого он выводит мне это:

11
He
is
a
very
very
good
boy

isn
t
he

Может ли кто-нибудь подсказать мне, как исправить эту проблему? Я знаю, что проблема в том, что когда моя программа встречает "," она автоматически разбивает строку, а затем снова, за которой следует "", она снова разбивает ее, поэтому в моем выводе создается пустая строка, но я понятия не имею, как это исправить, чтобы это разделит несколько разделителей одновременно.

Ответы [ 3 ]

2 голосов
/ 06 мая 2020

Во-первых, хотя символы со специальным значением в регулярном выражении, такие как ? и . в целом, должны быть экранированы, их не нужно экранировать, когда они находятся в классе символов, [].

Итак, ваш вызов split эквивалентен:

String[] words = s.split("[\\s\\-.'?,_@!]");

Необходимо экранировать только -, потому что он означает «to» в классе символов.

По сути, вы хотите это рассматривать ", " как один разделитель. Чтобы сопоставить один или несколько символов, вы должны использовать квантификатор +:

String[] words = s.split("[\\s\\-.'?,_@!]+");

Здесь вы говорите, что разделитель как минимум один из этих символов в классе символов.

Вот несколько визуализаций, чтобы увидеть, какие символы совпадают, сравните:

1 голос
/ 06 мая 2020
public static void main(String[] args) {
    String s = "He is a very very good boy, isn't he?";
    String[] words = s.split("([\\s\\-.\\'\\?\\,\\_\\@\\!])+");
    System.out.println(words.length);
    for (String word : words) {
        System.out.println(word);
    }
}
1 голос
/ 06 мая 2020

Попробуйте так.

  • Замените все символы, которые вам не нужны, пробелами
  • Затем разделите на один или несколько пробелов.
String s = "He is a very very good boy, isn't he?";
String[] words = s.replaceAll("[\\W]"," ").split("\\s+");
System.out.println(words.length);
for(int i = 0; i<words.length; i++) {
   System.out.println(words[i]);
}

Или просто используйте разделение на не словах

String[] words = s.split("\\W+");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...