Как разделить текст с помощью регулярных выражений, но разделенные слова продолжают сохранять разделитель регулярных выражений? - PullRequest
5 голосов
/ 17 августа 2011

У меня есть текст, и я использую это простое регулярное выражение, чтобы разбить его на слова: [ \n]. Он разбивает текст на слова, используя пробелы и переносы строк.

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

Я использую метод String#split.

Ответы [ 5 ]

7 голосов
/ 17 августа 2011

Вы можете использовать lookbehind, как предложил @Piotr Findeisen (+1):

public class RegexExample{
    public static void main(String[] args) {
    String s = "firstWordWithSpaceAfter secondWordWithSpaceAfter wordWithLineBreakAfter\nlastWord";
    String sa[] = s.split("(?<=[ \\n])");
    for (String saa : sa )
        System.out.println("[" + saa + "]");
    }
}

Вывод:

[firstWordWithSpaceAfter ]
[secondWordWithSpaceAfter ]
[wordWithLineBreakAfter
]
[lastWord]

Краткое объяснение:

?<= isпосмотрите назад, это означает, что вы получили совпадение, если данные перед искомым выражением совпадают с регулярным выражением, следующим после ?<= (в данном случае [ \\n])

[ \\n] является регулярным выражением, что означает один из символов в []

, поэтому все регулярные выражения говорят, что разделяется каждый раз, когда символ перед выражением / словом либо пробел, либо \n.

Поскольку мы не пытались сопоставить пробел или \n, они не будут удалены.

5 голосов
/ 17 августа 2011

Подумайте об использовании положительного lookbehind / lookahead нулевой ширины.См. Шаблон Javadoc вокруг Специальные конструкции (без захвата)

0 голосов
/ 17 августа 2011

Я до сих пор не уверен, что вы пытаетесь сделать, но если \ n имеет значение, отличное от "", вам следует разбираться с ними отдельно.

String[] sentences = text.split("\\n");
...
for (String sentence : sentences) {
    ...
    String[] words = sentence.split(" ");
    ...
}
0 голосов
/ 17 августа 2011

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

Немного грязно, но должно сработать.

0 голосов
/ 17 августа 2011

Я думаю, что ваш единственный вариант - сделать что-то вроде этого:

String myString = "Joe Blow\n1234 Fake Road\nHere, There, 12345";
String[] lines = myString.split("\\n");
Set<String[]> wordsByLine = new LinkedHashSet<String[]>();
for (String line : lines) {
  wordsByline.add(line.split(" "));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...