Как сохранить разделитель при использовании RegEx? - PullRequest
7 голосов
/ 20 августа 2011

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

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

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

Я делаю это:

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

И у меня есть это:

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

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

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

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

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

Ответы [ 5 ]

2 голосов
/ 20 августа 2011

Вы уверены, что хотите использовать регулярные выражения? Есть более быстрая реализация для разделения по одному символу: 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...
}
1 голос
/ 20 августа 2011

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

/\s|(?=[\.,:?!](\W|$))|(?<=\W[\.:?!])/
1 голос
/ 20 августа 2011

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

String s  = "one,two, three   four ,  five";
s = s.replaceAll("([,\\s]+)", "#$1#");
Pattern p = Pattern.compile("#");
String[] result = p.split(s);
0 голосов
/ 23 августа 2011
public static final String PUNCTUATION_SEPARATOR =
    "("
    + "("
    + "(?=^[\"'!?.,;:(){}\\[\\]-]+)"
    + "|"
    + "(?<=^[\"'!?.,;:(){}\\[\\]-]+)"
    + ")"
    + "|"
    + "("
    + "(?=[\"'!?.,;:(){}\\[\\]-]+($|\n))"
    + "|"
    + "(?<=[\"'!?.,;:(){}\\[\\]-]+($|\n))"
    + ")"
    + ")";
0 голосов
/ 20 августа 2011

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

...