Я хочу разбить длинную строку на массив ее содержимого по слову, используя регулярное выражение. Сейчас я использую (? <= \ B), но проблема в том, что он разбивает слова, которые являются сокращениями (например, вы фиксируете и тому подобное). Мне нужно регулярное выражение, которое сделало бы пунктуацию отдельным элементом, за исключением случаев, указанных выше, вместе с табуляциями, пробелами и новыми строками, которые также являются их собственными элементами. Любые идеи?
Проверьте StringTokenizer. Вы можете указать несколько разделителей (2-й параметр) и указать, следует ли возвращать такие разделители (для 3-го параметра установлено значение true, чтобы вернуть пробел, новую строку, табуляцию и т. д.). Если вы не хотите, чтобы пробел, табуляция, новая строка возвращались как токены, установите значение false (или еще лучше, не используйте третий параметр).
String testString = "this isn't\nright\t 'cause it ain't true";
StringTokenizer s = new StringTokenizer(testString," \n\t\r",true);
while (s.hasMoreTokens()) {
System.out.println("'" + s.nextToken() + "'");
}
Выходы:
'this'
' '
'isn't'
'
'
'right'
' '
' '
''cause'
' '
'it'
' '
'ain't'
' '
'true'
Я думаю, что вам нужно посмотреть определение \b
(«граница слова»), а затем \ w («слово») и переопределить '
как часть слова. Что-то вроде этого, хотя это зависит от того, нужны ли вам и разделители, или вы можете позволить регулярному выражению проглотить их.
public static void main( String[] args ) {
String test = "Don't fear the reaper.";
String regex = "[^a-zA-Z0-9']";
System.out.println( Arrays.toString( test.split( regex ) ) );
}
Выход:
run:
[Don't, fear, the, reaper]
BUILD SUCCESSFUL (total time: 0 seconds)