Вместо разделения, вы должны попытаться сопоставить регулярное выражение, чтобы получить желаемый результат.Попробуйте использовать это регулярное выражение в Java,
[a-zA-Z]+|\\p{Punct}
Здесь [a-zA-Z]+
часть соответствует одному или нескольким алфавитам, а \\p{Punct}
часть соответствует любому знаку пунктуации, и если вы знакомы с POSIX
представлением, то этоэквивалентно [[:punct:]]
.Люди, пытающиеся применить подобное решение к языкам / инструментам, поддерживающим представление POSIX
, могут использовать [a-zA-Z]+|[[:punct:]]
regex.
Java-код,
List<String> list = new ArrayList<String>();
String s = "Hello from the outside(outside).";
Pattern p = Pattern.compile("[a-zA-Z]+|\\p{Punct}");
Matcher m = p.matcher(s);
while (m.find()) {
list.add(m.group());
}
System.out.println(list);
Печатает вывод, как вы хотели,
[Hello, from, the, outside, (, outside, ), .]
Редактировать: Благодаря Андреас за его хорошее предложение.Если вы хотите включить буквы не только из английского, но и из других языков, то лучше использовать это регулярное выражение,
\\p{L}+|\\p{P}
As, \\p{L}
будет охватывать не только английский, но и алфавиты любого другого языка, представленные вUnicode.
Но, обратите внимание, это может немного увеличить производительность, потому что теперь он может пытаться сопоставить не только [a-z]
, но и другие символы Unicode.Таким образом, есть небольшой компромисс, поэтому используйте тот, который больше соответствует вашим потребностям.
Еще раз спасибо Андреас за ваше ценное предложение.