2014-01-10 2 views
3

Я пытаюсь разбить строку на пробелы и некоторые специальные символы.Java Split на пространствах и специальных символах

Учитывая строку «джон - & + $ @ мальчик?». Я хочу, чтобы получить массив:

array[0]="john"; 
array[1]="boy"; 

Я пытался несколько регулярных выражений и не получил не где. Вот мой текущий укус:

String[] terms = uglString.split("\\s+|[\\-\\+\\$\\?\\[email protected]&].*"); 

Какие консервы «джон», но не «мальчик». Может ли кто-нибудь получить от меня все остальное?

+1

Я думаю, что важно знать, какие символы должны допускаться в каждом значении массива; в противном случае ваш вопрос будет достаточно открытым и неопределенным. – tenub

+0

Это часть руб, я еще не знаю их всех. –

+0

проверить это http://www.vogella.com/tutorials/JavaRegularExpressions/article.html и проверить здесь http://www.regexe.com/ – zee

ответ

5

Просто используйте:

String[] terms = input.split("[\\[email protected]&.?$+-]+"); 

Вы можете поместить класс символов короткий рук внутри класса символов (обратите внимание на \s), и большинство мета-персонаж теряет свое значение внутри класса символов, за [ исключением, ], -, &, \. Однако & имеет смысл только тогда, когда он входит в пару &&, а - рассматривается как буквенный символ, если положить в начале или в конце класса символов.

Другие языки могут иметь разные правила для анализа шаблона, но правило для - применяется для большинства двигателей.

Как упоминал в своем ответе @Sean Patrick Floyd, важно, чтобы определить, что составляет слово. \w в Java эквивалентно [a-zA-Z0-9_] (английские буквы верхнего и нижнего регистра, цифры и подчеркивание), и поэтому \W состоит из всех других символов. Если вы хотите рассматривать буквы и цифры Unicode, вы можете посмотреть на Unicode character classes.

+0

+1 для Unicode. Я всегда забываю, что \ w - только ascii. –

4

Вы можете сделать ваш код намного проще, заменив ваш шаблон с "\\W+" (один или более вхождений без символа слова. (Таким образом, вы белый список символов вместо черных списков, которые, как правило, хорошая идея)

И, конечно, все может быть более эффективным при использовании Guava's Splitter class

0

добавить к тому, что было сказано о Splitter, вы можете сделать что-то в этом роде:

String str = "john - & + $ ? . @ boy"; 
    Iterable<String> ttt = Splitter.on(Pattern.compile("\\W")).trimResults().omitEmptyStrings().split(str); 
+0

'\ s \ W' эквивалентно' \ W'. Класс символа Word не содержит пробелов, поэтому не-словный класс символов содержит пробелы. – nhahtdh

+0

@nhahtdh Вы правы (обновлено) –

0

Breaking затем шаг за шагом:

Для вашего случая вы заменяете не-словные символы (как указано). Теперь вы можете сохранить пробелы для простого разделения строк.

String ugly = "john - & + $ ? . @ boy"; 
String words = ugly.replaceAll("[^\\w\\s]", ""); 

Есть много пробелов в результирующей строке, которые вы можете вообще обрезать только 1 пространство:

String formatted = words.trim().replaceAll(" +", " "); 

Теперь вы можете легко разделить строку на слова в массив строк :

String[] terms = formatted.split("\\s"); 
System.out.println(terms[0]); 
Смежные вопросы