我的split()及其正则表达式出了什么问题?

时间:2014-08-27 13:38:01

标签: java regex string split double

我的部分应用程序遇到了这个问题。 String行变量包含 12.2 Andrew ,我试图单独拆分它们但它不起作用并且出现NumberFormatException错误。你能帮帮我吗?

String line = "12.2 Andrew";
String[] data = line.split("(?<=\\d)(?=[a-zA-Z])");

System.out.println(Double.valueOf.(data[0]));

3 个答案:

答案 0 :(得分:5)

你看过你的data变量了吗?它根本没有分裂任何东西,因为条件永远不会匹配。您正在输入一个数字之后和字母之前的输入中的位置,并且因为它之间存在空格。

尝试在中间添加一个空格,应该修复它:

String[] data = line.split("(?<=\\d) (?=[a-zA-Z])");

答案 1 :(得分:2)

如果您打印data[0]的内容,您会发现它仍然包含12.2 Andrew,因此您实际上没有拆分任何内容。那是因为你的正则表达式说:
拆分前面有数字的地方和后面的字母

用于

等数据
123foo345bar 123 baz

实际上只能在标有|

的地方拆分
123|foo345|bar 123 baz
                  ^it will not split `123 baz` like
                   `123| baz` because after digit is space (not letter)
                   `123 |baz` before letter is space (not digit)
                   so regex can't match it

您需要的是“拆分空间,其前面有数字,后面有字母”所以请使用

String[] data = line.split("(?<=\\d)\\s+(?=[a-zA-Z])");
//                                  ^^^^ - this represent one ore more whitespaces

答案 2 :(得分:2)

您的拆分无效,并且未拆分String。 因此Double.parseDouble正在解析整个输入。

尝试以下方法:

String line = "12.2 Andrew";
String[] data = line.split("(?<=\\d)(?=[a-zA-Z])");
System.out.println(Arrays.toString(data));
// System.out.println(Double.valueOf(data[0]));
// fixed
data = line.split("(?<=\\d).(?=[a-zA-Z])");
System.out.println(Arrays.toString(data));
System.out.println(Double.valueOf(data[0]));

<强>输出

[12.2 Andrew]
[12.2, Andrew]
12.2