Сохранить разделить пунктуацией - PullRequest
0 голосов
/ 31 марта 2019

Мне нужно безопасно разбить строку Java на слова и знаки препинания.

Я пробовал этот код, но проблема в том, что он неправильно разделяет скобки.

String sentenceString = "Hello from the outside(outside).";
sentenceString.split("(?=,|\\.|!|\\?|\\(|\\))|\\s");

Фактические результаты

["Hello", "from", "the", "outside", "", "(outside", ")", "."]

Ожидаемый результат должен быть

["Hello", "from", "the", "outside", "(", "outside", ")", "."]

1 Ответ

2 голосов
/ 31 марта 2019

Вместо разделения, вы должны попытаться сопоставить регулярное выражение, чтобы получить желаемый результат.Попробуйте использовать это регулярное выражение в 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.Таким образом, есть небольшой компромисс, поэтому используйте тот, который больше соответствует вашим потребностям.

Еще раз спасибо Андреас за ваше ценное предложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...