У меня есть следующая строка "3/4Ton". Я хочу разделить его как->
Word [1] = 3/4 и Word [2] = Тонна.
Прямо сейчас моя часть кода похожа на этот:-
Pattern p = Pattern.compile("[A-Z]{1}[a-z]+");
Matcher m = p.matcher(line);
while(m.find()){
System.out.println("The word --> "+m.group());
}
Это выполняет необходимую задачу разделения строки на основе прописных букв как:-
Строка = MachineryInput
Word [1] = Оборудование, Word [2] = Вход
Единственная проблема - это, не сохраняет, числа или сокращения или последовательности прописных букв, которые не предназначены, чтобы быть отдельными словами. Мог кто-то выручать меня с моей проблемой кодирования регулярного выражения.
Заранее спасибо...
На самом деле вы можете сделать это только в регулярном выражении, используя просмотр вперед и просмотр назад (см. специальные конструкции на этой странице: http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html )
/**
* We'll use this pattern as divider to split the string into an array.
* Usage: myString.split(DIVIDER_PATTERN);
*/
private static final String DIVIDER_PATTERN =
"(?<=[^\\p{Lu}])(?=\\p{Lu})"
// either there is anything that is not an uppercase character
// followed by an uppercase character
+ "|(?<=[\\p{Ll}])(?=\\d)"
// or there is a lowercase character followed by a digit
;
@Test
public void testStringSplitting() {
assertEquals(2, "3/4Word".split(DIVIDER_PATTERN).length);
assertEquals(7, "ManyManyWordsInThisBigThing".split(DIVIDER_PATTERN).length);
assertEquals(7, "This123/4Mixed567ThingIsDifficult"
.split(DIVIDER_PATTERN).length);
}
Итак, что вы можете сделать примерно так:
for(String word: myString.split(DIVIDER_PATTERN)){
System.out.println(word);
}
Шон
Здесь было бы неплохо использовать regex. Наверняка есть способ сделать и это, хотя я не специалист по regex, поэтому не могу вам помочь. Однако, есть кое-что, чего вы не можете избежать - что-то, где-то должно в конце концов перебрать вашу String. Вы можете сделать это "самостоятельно" следующим образом:
String[] splitOnCapitals(String str) {
ArrayList<String> array = new ArrayList<String>();
StringBuilder builder = new StringBuilder();
int min = 0;
int max = 0;
for(int i = 0; i < str.length(); i++) {
if(Character.isUpperCase(str.charAt(i))) {
String line = builder.toString().trim();
if (line.length() > 0) array.add(line);
builder = new StringBuilder();
}
builder.append(str.charAt(i));
}
array.add(builder.toString().trim()); // get the last little bit too
return array.toArray(new String[0]);
}
Я протестировал это со следующим тестовым драйвером:
public static void main(String[] args) {
String test = "3/4 Ton truCk";
String[] arr = splitOnCapitals(test);
for(String s : arr) System.out.println(s);
test = "Start with Capital";
arr = splitOnCapitals(test);
for(String s : arr) System.out.println(s);
}
И получил следующий результат:
3/4
Ton tru
Ck
Start with
Capital