如何检查一个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() }
- 我该如何告诉Spring Boot可执行jar使用哪个主类?
- SEVERE:找不到媒体types= application / json的MessageBodyWriter,type = class com.jersey.jaxb.Todo,genericType = class com.jersey.jaxb.Todo
- 设置jLabel的打印尺寸并在打印件上放置jRadiobutton
- 用于ListView的Android自定义行项目
- CATALINA_OPTS vs JAVA_OPTS – 有什么区别?
- 打印所有加载的Spring bean
- 如何使用Java读取PDF文件?
- 将int转换为String的最有效方法是什么?
- 改造GSON将date从jsonstring序列化为java.util.date