2016-11-17 496 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 S上的问题是,+/-标志是不可选的,不会在你的例子匹配(也是最后的子模式需要一个逗号,但你的例子并不一端) 。

假设你的榜样String旨意绝不包含本地化的多个分离的目的一个逗号,你不希望使用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

是的。好得多分开','。 – 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

相关问题