разбить строку на основе шаблона в Java - заглавные буквы и цифры - PullRequest
5 голосов
/ 17 мая 2010

У меня есть следующая строка "3 / 4Ton". Я хочу разделить это как ->

слово [1] = 3/4 и слово [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());
    }

Выполняет необходимую задачу разбиения строки на основе заглавных букв, таких как: -

String = MachineryInput

слово [1] = машинное оборудование, слово [2] = ввод

Единственная проблема заключается в том, что в нем не сохраняются цифры или сокращения или последовательности заглавных букв, которые не должны быть отдельными словами. Может кто-нибудь помочь мне с моей проблемой кодирования регулярных выражений.

Заранее спасибо ...

Ответы [ 2 ]

4 голосов
/ 17 мая 2010

Вы можете сделать это только в регулярном выражении, используя взгляд в будущее и взгляд в прошлое. (см. специальные конструкции на этой странице: 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);
}

Sean

2 голосов
/ 17 мая 2010

Использование регулярных выражений было бы неплохо здесь. Могу поспорить, что есть способ сделать это тоже, хотя я не являюсь парнем регулярных выражений, поэтому я не могу вам помочь. Тем не менее, есть кое-что, чего вы не можете избежать - что-то, где-то нужно перебрать вашу строку. Вы можете сделать это «по своему усмотрению» следующим образом:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...