Как сохранить разделитель при использовании RegEx?

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

Supossing у меня есть этот текст:

String text = "wor.d1, :word2. wo,rd3? word4!"; 

Я делаю так:

String parts[] = text.split(" ");

а у меня такое:

wor.d1, | :word2. | wor,d3? | word4!;

что мне нужно сделать, чтобы иметь это? (держите символы на границах, но только то, что я указываю:.,!?: не все).

wor,d1 | , | : | word2 | . | wor,d3 | ? | word4 | !

обновление

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

есть способ не иметь этот пустой символ в начале?

это регулярное выражение-это хорошо, или есть более простой способ?

public static final String PUNCTUATION_SEPARATOR =
        "("
        + "("
        + "(?=^["'!?.,;:(){}[]]+)"
        + "|"
        + "(?<=^["'!?.,;:(){}[]]+)"
        + ")"
        + "|"
        + "("
        + "(?=["'!?.,;:(){}[]]+($|n))"
        + "|"
        + "(?<=["'!?.,;:(){}[]]+($|n))"
        + ")"
        + ")";

5 ответов


вы уверены, что хотите использовать regex ? Существует более быстрая реализация для разделения на один символ: StringTokenizer. И это то, что может вернуть разделители.

String str= "word1, word2. word3? word4!";
String delim = ",.!?";
StringTokenizer st = new StringTokenizer(str, delim, true);
while (st.hasMoreTokens()) {
  String token = st.nextToken();
  ... // token will be: "word1", ",", " word2", ".", etc...
}

для простых сепараторов я рекомендую StringTokenizer. Но вот решение с использованием regex и другого вспомогательного разделителя:

String s  = "one,two, three   four ,  five";
s = s.replaceAll("([,\s]+)", "##");
Pattern p = Pattern.compile("#");
String[] result = p.split(s);

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

/\s|(?=[\.,:?!](\W|$))|(?<=\W[\.:?!])/

по-моему, вы хотите этой. Сначала вы взрываете свою строку, а на втором этапе используете функцию implode.


public static final String PUNCTUATION_SEPARATOR =
    "("
    + "("
    + "(?=^[\"'!?.,;:(){}\[\]-]+)"
    + "|"
    + "(?<=^[\"'!?.,;:(){}\[\]-]+)"
    + ")"
    + "|"
    + "("
    + "(?=[\"'!?.,;:(){}\[\]-]+($|\n))"
    + "|"
    + "(?<=[\"'!?.,;:(){}\[\]-]+($|\n))"
    + ")"
    + ")";