Использование регулярных выражений для разбиения предложения на токены, освобождая его от всех необходимых знаков препинания, исключая пунктуацию, являющуюся частью слова - PullRequest
0 голосов
/ 23 января 2019

Итак, я хочу разбить предложение на отдельные токены.Тем не менее, я не хочу избавляться от некоторых знаков препинания, которые я хочу быть частью токенов.Например, «не» должно оставаться как «не» в конце слова, если за пунктуацией не следует буква, которую следует убрать.Так что вы?"должны быть преобразованы в «ты», то же самое с начала: «ты» должен быть «ты».

String str = "..Hello ?don't #$you %know?";
    String[] strArray = new String[10];

    strArray = str.split("[^A-za-z]+[\\s]|[\\s]");
    //strArray[strArray.length-1]

    for(int i = 0; i < strArray.length; i++) {
        System.out.println(strArray[i] + i);
    }

Это должно просто распечатать: hello0 not1 you2 know3

1 Ответ

0 голосов
/ 23 января 2019

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

[a-zA-Z]+(['][a-zA-Z]+)?

Это регулярное выражение разрешает помещать в него только один '. Если вы хотите разрешить любой другой такой символ, просто поместите его в набор символов ['], и сейчас он разрешит только один раз, а если вы хотите разрешить несколько раз, вам придется изменить ? в конце с *, чтобы сделать это ноль или более раз.

Оформите ваш модифицированный код Java,

List<String> tokenList = new ArrayList<String>();
String str = "..Hello ?don't #$you %know?";
Pattern p = Pattern.compile("[a-zA-Z]+(['][a-zA-Z]+)?");
Matcher m = p.matcher(str);
while (m.find()) {
    tokenList.add(m.group());
}

String[] strArray = tokenList.toArray(new String[tokenList.size()]);

for (int i = 0; i < strArray.length; i++) {
    System.out.println(strArray[i] + i);
}

Печать

Hello0
don't1
you2
know3

Однако, если вы настаиваете на использовании только метода split, вы можете использовать это регулярное выражение для разделения значений,

[^a-zA-Z]*\\s+[^a-zA-Z]*|[^a-zA-Z']+

Который в основном разбивает строку на один или несколько пробелов, необязательно окруженных неалфавитными символами, или разделяется последовательностью из одного или нескольких неалфавитных символов и не одинарных кавычек. Вот пример кода Java с использованием split,

String str = "..  Hello ?don't #$you %know?";
String[] strArray = Arrays.stream(str.split("[^a-zA-Z]*\\s+[^a-zA-Z]*|[^a-zA-Z']+")).filter(x -> x.length()>0).toArray(String[]::new);

for (int i = 0; i < strArray.length; i++) {
    System.out.println(strArray[i] + i);
}

печать

Hello0
don't1
you2
know3

Обратите внимание, здесь я использовал метод filter для потоков, чтобы фильтровать токены нулевой длины, так как split может генерировать токены нулевой длины в начале массива.

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