2015-09-10 1 views
-2

У меня есть строка, которая выглядит как «12:00:00, 2: 30: 003: 45: 00,23: 45: 00». Теперь мое требование - я хочу извлечь строку перед запятой и хотите поместить их в список и другой список в другом списке, я сделал что-то кроме того, что не работает, я даю мой кодКак извлечь строку перед запятой в Java

String[] toks = "12:00:00, 2:30:003:45:00,23:45:00". 
       split("\\s*,\\s*|(?<=[ap]m)(?=\\d)"); 

for (String tok: toks){ 
     System.out.printf("[%s]%n", tok); 
    } 

Но что дает выход в

[12:00:00] 
[2:30:003:45:00] 
[23:45:00] 

Мой желаемый результат: 12: 00: 00,3: 45: 00 в списке и 2: 30: 00,23: 45: 00 в списке, как достичь этого? Кто-нибудь, пожалуйста, помогите

+0

может кто-нибудь помочь, я не получаю, что делать? – lucifer

+0

Ваше описание вопроса очень неясно. Возможно, попробуйте объяснить, что вы пытаетесь сделать, сколько списка вы хотите создать, какая часть текста должна быть помещена в список и почему. – Pshemo

ответ

1

Вот один из способов вы можете сделать согласование и извлечь эти элементы в 2-х различных списков:

Pattern p = Pattern.compile(
      "(\\d{1,2}:\\d{1,2}:\\d{1,2})\\s*,\\s*(\\d{1,2}:\\d{1,2}:\\d{1,2})"); 

Matcher m = p.matcher("12:00:00, 2:30:003:45:00,23:45:00"); 

List<String> list1 = new ArrayList<>(); 
List<String> list2 = new ArrayList<>(); 

while (m.find()) { 
    list1.add(m.group(1)); 
    list2.add(m.group(2)); 
} 

System.out.printf("%s%n%s%n", list1, list2); 

Выход:

[12:00:00, 3:45:00] 
[2:30:00, 23:45:00] 

Есть 2 группы захвата, используемые здесь для извлечения данных в 2 разных nt:

(\\d{1,2}:\\d{1,2}:\\d{1,2}) # hh:mm:ss timestamp (group #1) 
\\s*,\\s*      # separator is a comma surrounded by optional spaces 
(\\d{1,2}:\\d{1,2}:\\d{1,2}) # hh:mm:ss timestamp (group #2) 
0

Следующий код должен помочь вам достичь того, чего вы хотите для этого случая, в частности, (где вход ваша строка):

Pattern p = Pattern.compile("(\\d{1,2}:\\d{2}:\\d{2})\\s*,\\s*(\\d{1,2}:\\d{1,2}:\\d{1,2})(\\d{1,2}:\\d{2}:\\d{2})\\s*,\\s*(\\d{1,2}:\\d{2}:\\d{2})"); 
Matcher m = p.matcher(input); 
if (m.matches) { 
    list1.add(m.group(1)); 
    list1.add(m.group(3)); 
    list2.add(m.group(2)); 
    list2.add(m.group(4)); 
} 

Этот код делает предположение о том, что те, в 4 раза, второй и третий не имеют разделителя и что секундная часть всегда присутствует и имеет две цифры.

Для получения дополнительной информации о том, что этот шаблон означает, отметьте Java documentation.

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

0

Почему бы не сделать что-то вроде /.\d:.\d:.\d/ в соответствии с шаблоном времени?

1

насчет

final String s = "12:00:00, 2:30:003:45:00,23:45:00"; 

final Pattern p = Pattern.compile("\\s*(\\d+:\\d\\d:\\d\\d)"); 
final Matcher m = p.matcher(s); 
final List<String> tokens = new ArrayList<>(); 
while(m.find()) { 
    tokens.add(m.group(1)); 
} 
for (String tok: tokens){ 
    System.out.printf("[%s]%n", tok); 
} 
+0

его выполнение, но мое требование заключалось в том, чтобы поместить их в отдельный список – lucifer

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