2016-04-07 3 views
-1

Я хочу, чтобы разделить строку String line = "20E WED 01PM 0E"; так, что у меня есть переменный для каждой «части», где части будет выглядеть примерно так:Как разбить эту строку (Java)?

int fDegree = 20; 
String fDegreeEW = "E"; 
String day = "WED"; 
int time = 01; \\ '1' is fine too 
String amPm = "PM"; 
int sDegree = 0; 
String sDegreeEW = "E"; 

Я думал о первом расщепления строки, line в пространствах, а затем делать regex на каждой части, чтобы получить данные, но я не мог заставить это работать. Какой был бы самый лучший способ разделить String как на кучу разных переменных? Примечание. Это не единственная строка, которую я хочу проверить. Например, первый «20» также может быть «1» или «165», поэтому слова и цифры необязательно имеют заданную длину. Но образ числа, слова, пространства, слова, пространства, числа, слова, пространства, числа, слова всегда будет правдой.

Edit: Я пробовал:

String line = "20E WED 01PM 0E"; 
String[] splitArray = line.split(" "); 
Scanner scanner = new Scanner(splitArray[0]); 
int fDegree = scanner.nextInt(); 

но бросил InputMismatchException. Могу ли я использовать сканер здесь или нет?

+1

Сплит с использованием разделителя пространства в первую очередь. Затем используйте регулярное выражение для разделения каждой подстроки на число и буквы. Не используйте сканер, попробуйте следующее: http://stackoverflow.com/questions/8270784/how-to-split-a-string-between-letters-and-digits-or-between-digits-and-letters Никто не напишет вам код. Если у вас есть код, который не работает, вы можете опубликовать его здесь, чтобы люди могли указать, почему он не работает. – rgamber

+0

@rgamber Почему 'split()' (который использует регулярное выражение), а затем regex каждую часть, когда одно регулярное выражение может выполнять всю работу? – Andreas

+0

Согласен! мой комментарий был поспешно написан! Я не могу отредактировать свой комментарий, кажется, слишком поздно. Спасибо за исправление! – rgamber

ответ

4

Это регулярное выражение будет делать это:

(\d+)(\w+)\s+(\w+)\s+(\d+)(\w+)\s+(\d+)(\w+) 

См regex101 for demo (смотрите на «сопрягать информацию» на панели справа).

Вот как код:

Pattern p = Pattern.compile("(\\d+)(\\w+)\\s+(\\w+)\\s+(\\d+)(\\w+)\\s+(\\d+)(\\w+)"); 

String line = "20E WED 01PM 0E"; 
Matcher m = p.matcher(line); 
if (! m.matches()) 
    throw new IllegalArgumentException("Bad input: " + line); 
int fDegree = Integer.parseInt(m.group(1)); 
String fDegreeEW = m.group(2); 
String day  = m.group(3); 
int time  = Integer.parseInt(m.group(4)); 
String amPm  = m.group(5); 
int sDegree = Integer.parseInt(m.group(6)); 
String sDegreeEW = m.group(7); 

Узор переменная p могут быть повторно использованы для каждой строки.

+0

Это действительно помогло, спасибо! – kneedhelp

1

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

String line = "20E WED 01PM 0E"; 
String[] splitted = line.split(" "); 
for(int i = 0; i < splitted.length(); i++){ 
System.out.println(splitted[i]); 
} 
+0

Можно также использовать 'System.out.println (Arrays.toString (split));'. – ifly6

+0

Абсолютно. Но способ, которым я могу, может легко позволить другому узнать, как обрабатывать каждое значение в цикле for –

3

Джонни прав насчет сканера, но вы также должны рассмотреть вопрос о том, как данные будут введены. Было бы намного легче разделить эту информацию, если бы вы дали шаблон заданной длины.

Например, если у вас есть строка, введенная как «020 E WED 13 000 E», тогда все, что вам нужно сделать, разбивается на токен «» (пробел). Затем вам будет дана трехзначная степень, ваше кардинальное направление, день, 1:00 вечера на 24-часовой (13), еще три цифры (я полагаю, что вы никогда не будете ходить выше 360), а другой кардинальное направление.

Если вам нужно сохранить эту информацию в структуре данных (например, массиве) на более позднем этапе, вы можете либо использовать line.split(), либо StringTokenizer.

Смежные вопросы