public class Main {
public static void main(String[] args) {
String data = "500.00 56.48 500.00";
System.out.println(data.matches("^[0-9]+\\.[0-9]+\\s[0-9]+\\.[0-9]+\\s[0-9]+\\.[0-9]+$"));
}
}
输出:
true
但是,在以下情况下,它将无法提供预期的结果:
public class Main {
public static void main(String[] args) {
String data = ".5 5.6E2 500.00";
System.out.println(data.matches("^[0-9]+\\.[0-9]+\\s[0-9]+\\.[0-9]+\\s[0-9]+\\.[0-9]+$"));
}
}
输出:
false
尽管 .5 以及 5.6E2 是有效的 double 数字,你的模式无法识别它们。
推荐方法:
您应该在空白处分割数据行,并尝试使用 Double#parseDouble 例如
public class Main {
public static void main(String[] args) {
String data = "500.00 56.48 500.00";
System.out.println(matches(data));
data = ".5 5.6E2 500.00";
System.out.println(matches(data));
data = ".5 500.00";
System.out.println(matches(data));
data = ".5 abc 500.00";
System.out.println(matches(data));
}
static boolean matches(String data) {
String[] nums = data.split("\\s+");
boolean match = true;
if (nums.length == 3) {
for (String num : nums) {
try {
Double.parseDouble(num);
} catch (NumberFormatException e) {
match = false;
break;
}
}
} else {
match = false;
}
return match;
}
}
2条答案
按热度按时间kzipqqlq1#
别用你试过的方法做。
尽管您所使用的regex模式适用于您所使用的数字,但它在很大范围内都会失败。
.5
或者5.6E2
它们也是double
数字。下面是您的数据和模式演示:
输出:
但是,在以下情况下,它将无法提供预期的结果:
输出:
尽管
.5
以及5.6E2
是有效的double
数字,你的模式无法识别它们。推荐方法:
您应该在空白处分割数据行,并尝试使用
Double#parseDouble
例如输出:
rekjcdws2#
通过观察以下几点来改进正则表达式:
[0-9]
与相同\d
你在寻找同样的模式,三次所以,让我们这样做:
三次:
一个或多个数字,可选后跟
一个句点,然后是一个或多个数字,可以选择后跟
空白
也就是说:
(...){3}
哪里...
是:\d+
,可选后跟(\.\d+)?
(即零或一次),可选择后跟\s*
(零或更多)把这些放在一起,记住使用正确的字符串转义:
你可以看到它正在工作https://regex101.com/r/pgxam9/1,强烈建议保留regex101书签以备将来调试。