我想通过使用正则表达式来检测String
是否为小数。我的问题更多的是关于如何使用正则表达式机制而不是检测String
是小数。我使用RegExp
提供的GWT
类。
String regexDecimal = "\\d+(?:\\.\\d+)?";
RegExp regex = RegExp.compile(regexDecimal);
String[] decimals = { "one", "+2", "-2", ".4", "-.4", ".5", "2.5" };
for (int i = 0; i < decimals.length; i++) {
System.out.println(decimals[i] + " "
+ decimals[i].matches(regexDecimal) + " "
+ regex.test(decimals[i]) + " "
+ regex.exec(decimals[i]));
}
输出:
one false false null
+2 false true 2
-2 false true 2
.4 false true 4
-.4 false true 4
.5 false true 5
2.5 true true 2.5
我原以为String.matches()
和RegExp.test()
两种方法都会返回相同的结果。
RegExp.test()
获得相同的行为?答案 0 :(得分:1)
尝试将正则表达式更改为
"^\\d+(?:\\.\\d+)?$"
解释
双重逃避是因为我们在爪哇...
正则表达式从^
开始强制正则表达式从字符串的最开头匹配。
正则表达式以$
结尾,强制正则表达式从字符串的最末端开始匹配。
这是你应该如何让String.matches()与GWT RegExp.test()做同样的事情
答案 1 :(得分:1)
我不知道区别,但我会说RegExp.test()
是正确的,因为一旦你的字符串中有一个数字,你的正则表达式匹配,String.matches()
就像那里的锚点一样正则表达式。
\\d+(?:\\.\\d+)?
您的非捕获组是可选的,因此无论周围是什么,一个\\d
([0-9]
)都足以匹配。
当您向正则表达式添加锚点时,这意味着它必须匹配从开头到结尾的字符串,然后RegExp.test()
可能会显示相同的结果。
^\\d+(?:\\.\\d+)?$