2016-06-27 3 views
1

У меня есть несколько строк оценки игры в качестве входных данных. Ввод - это что-то вроде этого.Разделение имен команд с числами, разделенными пробелами и запятыми

Lions 1, FCAwesome 1 

В настоящее время я разделяю линию на запятую или пробел.

Charset charset = Charset.forName("US-ASCII"); 
String REGEX = ",?\\s+"; 
Pattern pattern = Pattern.compile(REGEX); 
try(BufferedReader reader = Files.newBufferedReader(path, charset)){ 

     int count = 0; 
     String line = null; 
     while((line = reader.readLine()) != null){ 
     String[] arr = pattern.split(line); 
     } 

Это прекрасно работает для предоставленного ввода. Однако, если имя команды имеет более одного слова, мой код прерывается.

Lions 1, FC Awesome 1 

Как изменить мой REGEX для обработки этого случая. FC Awesome все еще должно быть одним именем команды.

+0

Будет ли всегда использоваться '[Письма и возможно пробелы] [цифры]'? –

ответ

3

Try расщепление на пространстве, которое

  • имеет запятая перед ним (в том числе запятой) - отделить команда забьет пар.
  • имеет цифру после нее - отделить название команды и забьет,

Так что попробуйте с split(",\\s|\\s(?=\\d)")


Если есть вероятность, что некоторые части названия команды могут начинаться с цифры , мы можем уточнить наше условие. Мы можем потребовать от [space][digit] либо после запятой, либо для размещения в конце текста.

split(",\\s|\\s(?=\\d+(?=,|$))")

0

попытка разделить всю информацию запятой, а затем использовать getTeam метод ниже

class Team { 

    String name; 
    int score; 

    public Team(String name, int score) { 
     this.name = name; 
     this.score = score; 
    } 

    @Override 
    public String toString() { 
     return this.name + ", " + this.score; 
    } 

    public static Team getTeam(String data) {  
     String score = "";  
     int i = data.length() - 1;  
     for (; Character.isDigit(data.charAt(i)); i--) {  
       score += data.charAt(i);  
     }  
     String name = data.substring(0, i);  
     return new Team(name, Integer.parseInt(new StringBuilder(score).reverse().toString())); 
    } 
} 

, например, вход подобен этому

[email protected]# 1234 OLD 5555 ,TEAM2345NAME NAME 123NAME 4444

первое имя [email protected]# 1234 OLD и это оценка: 5555
второе имя TEAM2345NAME NAME 123NAME и 4444 является его оценка

примечание: оба содержат цифры или специальные символы в имени и даже места в бальной части.

сейчас все, что мне нужно, это создание экземпляра класса Team.
, как показано ниже, например:

String all_data = "[email protected]# 1234 OLD 5555  ,TEAM2345NAME NAME 123NAME 4444"; 
    // spliting data by comma 
    String parts[] = all_data.split(","); 

    // calling getTeam method 
    Team t1 = Team.getTeam(parts[0]); 
    Team t2 = Team.getTeam(parts[1]); 

затем использовать это поле, например, распечатать их.

System.out.println(t1.name); 
    System.out.println(t2.score); 
Смежные вопросы