如何检查一个string是否只包含Java中的数字

在Java的String类中有一个叫做matches的方法,如何使用这个方法来检查我的string是否只有使用正则expression式的数字。 我试着用下面的例子,但他们都返回我错误的结果。

String regex = "[0-9]"; String data = "23343453"; System.out.println(data.matches(regex)); 

 String regex = "^[0-9]"; String data = "23343453"; System.out.println(data.matches(regex)); 

尝试

 String regex = "[0-9]+"; 

要么

 String regex = "\\d+"; 

按照Java 正则expression式+表示“一次或多次”, \d表示“一个数字”。

注意:“双反斜杠”是一个转义序列来获得一个单一的反斜杠 – 因此,在一个Javastring\\d给你的实际结果: \d

参考文献:

Java正则expression式

Java字符转义序列


编辑:由于在其他答案中的一些混淆,我正在写testing用例,并将详细解释一些更多的东西。

首先,如果您对此解决scheme(或其他解决scheme)的正确性有疑问,请运行以下testing用例:

 String regex = "\\d+"; // positive test cases, should all be "true" System.out.println("1".matches(regex)); System.out.println("12345".matches(regex)); System.out.println("123456789".matches(regex)); // negative test cases, should all be "false" System.out.println("".matches(regex)); System.out.println("foo".matches(regex)); System.out.println("aa123bb".matches(regex)); 

问题1:是否有必要添加^$的正则expression式,所以它不会匹配“aa123bb”?

在java中, matches方法(在问题中指定)匹配完整的string,而不是片段。 换句话说,没有必要使用^\\d+$ (即使它也是正确的)。 请看最后的否定testing用例。

请注意,如果您使用在线“正则expression式检查器”,那么这可能会有不同的performance。 要在Java中匹配一个string的片段,可以使用find方法,这里详细描述:

Java Regex中的matches()和find()之间的区别

问题2:这个正则expression式是不是也匹配空string, ""

,正则expression式\\d*会匹配空string,但是\\d+不会。 星号*表示零个或多个,而加号+表示一个或多个。 请看第一个否定testing用例。

问题3:编译正则expression式不是更快吗?

是。 编译正则expression式模式的速度确实比一次快,而不是每次调用matches ,所以如果性能影响是重要的,那么可以像这样编译和使用Pattern

 Pattern pattern = Pattern.compile(regex); System.out.println(pattern.matcher("1").matches()); System.out.println(pattern.matcher("12345").matches()); System.out.println(pattern.matcher("123456789").matches()); 

您也可以使用Apache Commons中的NumberUtil.isNumber(String str)

还有一个解决scheme还没有发布,但是:

 String regex = "\\p{Digit}+"; // uses POSIX character class 

您必须允许多个数字( +符号),如下所示:

 String regex = "[0-9]+"; String data = "23343453"; System.out.println(data.matches(regex)); 
 Long.parseLong(data) 

并捕获exception,它处理减号。

虽然数字的数量是有限的,但是实际上会创build一个可以使用的数据的variables,也就是我想象的最常见的用例。

使用正则expression式在性能方面代价很高。 试图将stringparsing为一个长整型值是效率低下且不可靠的,可能并不是您所需要的。

我的build议是简单地检查每个字符是否是一个数字,使用Java 8 lambdaexpression式可以有效完成哪些操作:

 boolean isNumeric = someString.chars().allMatch(x -> Character.isDigit(x)); 

我们可以使用Pattern.compile("[0-9]+.[0-9]+")Pattern.compile("\\d+.\\d+") 。 他们有相同的意思。

模式[0-9]表示数字。 与“\ d”相同。 “+”意味着它出现更多次。 '' 整数或浮点数。

尝试下面的代码:

 import java.util.regex.Pattern; public class PatternSample { public boolean containNumbersOnly(String source){ boolean result = false; Pattern pattern = Pattern.compile("[0-9]+.[0-9]+"); //correct pattern for both float and integer. pattern = Pattern.compile("\\d+.\\d+"); //correct pattern for both float and integer. result = pattern.matcher(source).matches(); if(result){ System.out.println("\"" + source + "\"" + " is a number"); }else System.out.println("\"" + source + "\"" + " is a String"); return result; } public static void main(String[] args){ PatternSample obj = new PatternSample(); obj.containNumbersOnly("123456.a"); obj.containNumbersOnly("123456 "); obj.containNumbersOnly("123456"); obj.containNumbersOnly("0123456.0"); obj.containNumbersOnly("0123456a.0"); } } 

输出:

 "123456.a" is a String "123456 " is a String "123456" is a number "0123456.0" is a number "0123456a.0" is a String 

根据Oracle的Java文档:

 private static final Pattern NUMBER_PATTERN = Pattern.compile( "[\\x00-\\x20]*[+-]?(NaN|Infinity|((((\\p{Digit}+)(\\.)?((\\p{Digit}+)?)" + "([eE][+-]?(\\p{Digit}+))?)|(\\.((\\p{Digit}+))([eE][+-]?(\\p{Digit}+))?)|" + "(((0[xX](\\p{XDigit}+)(\\.)?)|(0[xX](\\p{XDigit}+)?(\\.)(\\p{XDigit}+)))" + "[pP][+-]?(\\p{Digit}+)))[fFdD]?))[\\x00-\\x20]*"); boolean isNumber(String s){ return NUMBER_PATTERN.matcher(s).matches() }