Разделение предложения в словах, где слово (слова) также включают несколько пробелов с помощью регулярного выражения - PullRequest
2 голосов
/ 31 марта 2020

Имея предложение с несколькими пробелами, используя регулярное выражение, я пытаюсь добиться следующего:

пример предложения: Это простой текст.

Ожидаемый результат : [This, is, a, simple, text.]

Фактический результат : [This, is, a, simple, text.]

ArrayList<String> tokens = new ArrayList<>();
Pattern tokSplitter = Pattern.compile("[a-zA-Z.*//s*]+");
Matcher m = tokSplitter.matcher("This     is a simple text.");
    while (m.find()) {
            tokens.add(m.group());
    }
    System.out.println(tokens);

Ответы [ 4 ]

2 голосов
/ 01 апреля 2020

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

List<String> tokens = Arrays.asList("This     is a simple text.".split("\\b "));

. Создается список с тем же содержимым, что и текущий принятый ответ . Стоит отметить, что оба решения занимают один пробел-разделитель и сохраняют только дополнительные пробелы, тогда как вывод System.out.println(tokens); равен [This, is, a, simple, text.], поскольку метод toString() всех стандартных реализаций List вставляет пробел после каждой запятой.

Если вы хотите сохранить все пробелы, вам придется использовать

List<String> tokens = Arrays.asList("This     is a simple text.".split("\\b(?= )"));

. Фактические строки результата можно увидеть при использовании:

tokens.forEach(s -> System.out.println('"'+s+'"'));
"This"
"     is"
" a"
" simple"
" text."

по сравнению с

"This"
"    is"
"a"
"simple"
"text."

других решений.

Если вы хотите иметь дело с Pattern напрямую, например, для возможности его повторного использования, он все равно не мешает вам использовать split вместо совпадения l oop:

Pattern wordEnd = Pattern.compile("\\b(?= )");
List<String> tokens = Arrays.asList(wordEnd.split("This     is a simple text."));
tokens.forEach(s -> System.out.println('"'+s+'"'));
2 голосов
/ 31 марта 2020

Вы можете написать что-то вроде:

public static void main(String[] args) {
    ArrayList<String> tokens = new ArrayList<>();
    Pattern tokSplitter = Pattern.compile("(\\s*[a-zA-Z.]+)\\s?");
    Matcher m = tokSplitter.matcher("This     is a simple text.");
    while (m.find()) {
        tokens.add(m.group(1));
    }
    System.out.println(tokens);
}

out: [This, is, a, simple, text.]

2 голосов
/ 31 марта 2020

Я думаю, что использование lookaround - это самый простой способ решить вашу проблему.

Pattern tokSplitter = Pattern.compile("(?<=\\S)\\s");
String str = "This     is a simple text.";
ArrayList<String> tokens = Arrays.asList(tokSplitter.split(str));
System.out.println(tokens);
1 голос
/ 31 марта 2020

Вот простой шаблон для решения вашей задачи: \s*\S+

Демо .

Код будет:

ArrayList<String> tokens = new ArrayList<>();
Pattern tokSplitter = Pattern.compile("\\s*\\S+");
Matcher m = tokSplitter.matcher("This     is a simple text.");
    while (m.find()) {
            tokens.add(m.group());
    }
    System.out.println(tokens);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...