2016-11-17 2 views
0

Я пытаюсь получить 1 длинный (метку) и 3 выплывает полезной нагрузки сообщения, строки я передаю выглядит так (игнорировать кавычки):Java регулярное выражение разделенные запятой числа

"5737540811294,359.306580,7.948747,6.6707006621" 

с помощью этого метода

private static void processAnglesMsg(String s) { 
    final Pattern dataTFFFsplit = Pattern.compile("[+-]([0-9]+)," 
               + "[+-]([0-9]*[.])?[0-9]+," 
               + "[+-]([0-9]*[.])?[0-9]+," 
               + "[+-]([0-9]*[.])?[0-9]+,"); 
    Matcher data = dataTFFFsplit.matcher(s.trim()); 
    if(data.matches()) { 
     Long time = Long.parseLong(data.group(1)); 
     float yaw = Float.parseFloat(data.group(2)); 
     float pitch = Float.parseFloat(data.group(3)); 
     float roll = Float.parseFloat(data.group(4)); 
     System.out.format("Angles - [%8d] Yaw: %08.3f Pitch: %08.3f Roll: %08.3f%n",time,yaw, pitch,roll); 
    } else { 
     if(debugLevel>=4) System.out.println("DEBUG processAnglesMsg: "+s); 
    } 
} 

я храню достижения отладочный код с:

DEBUG processAnglesMsg: 5737540811294,359.306580,7.948747,6.6707006 621 *

поэтому он выглядит как шаблон, который у меня не работает, и data.matches() возвращает false, несмотря на большой поиск. Я не вижу, что я сделал неправильно. Я хочу, чтобы шаблон допускал дополнительный + или - хотя мои текущие данные не содержат этого.

+0

Любопытно, почему бы просто не использовать s.trim.split (""), а затем сделать '' разобрать *? – randominstanceOfLivingThing

+0

Знаете ли вы, что вы можете использовать '\ d' вместо' 0-9' - хотя вы, возможно, никогда не пострадали, он более надежен в странных локалях. – slim

+1

@slim [docs] (https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html) утверждают, что '\ d' является предопределенным символьным классом для точно' [0-9] '. Локализация не должна быть релевантной. – Mena

ответ

3

Проблема с суб- Pattern с, что знак +/- не является обязательным и не будет соответствовать в вашем примере (также последний суб-модель требует запятой, но ваш пример не заканчивается с одним) ,

Предположим, что ваш пример String s никогда не будет содержать запятые для локализованных число разделяющих целей, и что вы не хотите использовать структуру CSV парсинга:

String example = "5737540811294,359.306580,7.948747,6.6707006621"; 
// splits the input based on comma 
String[] split = example.split(","); 
// parses desired data types 
// will throw runtime NumberFormatException if something's un-parseable 
System.out.println(Long.parseLong(split[0])); 
System.out.println(Float.parseFloat(split[1])); 
System.out.println(Float.parseFloat(split[2])); 
System.out.println(Float.parseFloat(split[3])); 

Выходные (значения округлены)

5737540811294 
359.30658 
7.948747 
6.6707006 

Примечание

Вы также можете использовать BigDecimal вместо Float, если хотите сохранить как можно больше десятичных знаков.

Например:

System.out.println(new BigDecimal(split[3])); 

Выход

6.6707006621 
+1

yep. гораздо лучше расколоться на ",". – MYGz

+0

Спасибо, что работает, я не должен был его усложнять, я буду использовать это решение. Если кто-нибудь может сказать мне, что я сделал неправильно в моем методе, я хотел бы узнать правильное регулярное выражение. – gjwo

+1

@gjwo добро пожаловать. Если вы обновите страницу, вы увидите, что не так с вашим исходным шаблоном в начале моего ответа. – Mena

1

Использование сканера:

Scanner scanner = new Scanner(input).useDelimiter(","); 
long time = scanner.nextLong(); 
float yaw = scanner.nextFloat(); 
float pitch = scanner.nextFloat(); 
float roll = scanner.nextFloat(); 

легче кода и легче читать.


Если вход не всегда совпадают:

Scanner scanner = new Scanner(input).useDelimiter(","); 
try { 
    long time = scanner.nextLong(); 
    float yaw = scanner.nextFloat(); 
    float pitch = scanner.nextFloat(); 
    float roll = scanner.nextFloat(); 
    System.out.format("Angles - [%8d] Yaw: %08.3f Pitch: %08.3f Roll: %08.3f%n",time,yaw, pitch,roll); 
} catch (NoSuchElementException e) { 
    // input didn't match due to insufficient elements or parsing failure 
} 
+0

Хороший тоже, и не бокс над головой. Ну, нет «бокса», но некоторые * летающие * видимо :) – Mena

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