Как сохранить разделитель при использовании 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);
по-моему, вы хотите этой. Сначала вы взрываете свою строку, а на втором этапе используете функцию implode.
public static final String PUNCTUATION_SEPARATOR =
"("
+ "("
+ "(?=^[\"'!?.,;:(){}\[\]-]+)"
+ "|"
+ "(?<=^[\"'!?.,;:(){}\[\]-]+)"
+ ")"
+ "|"
+ "("
+ "(?=[\"'!?.,;:(){}\[\]-]+($|\n))"
+ "|"
+ "(?<=[\"'!?.,;:(){}\[\]-]+($|\n))"
+ ")"
+ ")";