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