在Java for String类中,有一个名为matches的方法,如何使用此方法检查我的字符串是否只使用正则表达式的数字.我试着用下面的例子,但是他们两个都把我弄错了.
String regex = "[0-9]";
String data = "23343453";
System.out.println(data.matches(regex));
Run Code Online (Sandbox Code Playgroud)
String regex = "^[0-9]";
String data = "23343453";
System.out.println(data.matches(regex));
Run Code Online (Sandbox Code Playgroud)
vik*_*eve 315
尝试
String regex = "[0-9]+";
Run Code Online (Sandbox Code Playgroud)
要么
String regex = "\\d+";
Run Code Online (Sandbox Code Playgroud)
根据Java 正则表达式, +
表示"一次或多次"并且\d
表示"一个数字".
注意:"双反斜杠"是一个获取单个反斜杠的转义序列 - 因此,\\d
在java String中为您提供实际结果:\d
参考文献:
编辑:由于其他答案中的一些混淆,我正在编写一个测试用例,并将详细解释更多的东西.
首先,如果您对此解决方案(或其他)的正确性存在疑问,请运行此测试用例:
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));
Run Code Online (Sandbox Code Playgroud)
问题1:是否有必要添加^
和$
正则表达式,所以它不匹配"aa123bb"?
号在Java中,matches
方法(这是在问题中指定)相匹配的完整的字符串,而不是片段.换句话说,没有必要使用^\\d+$
(即使它也是正确的).请查看最后的负面测试用例.
请注意,如果您使用在线"正则表达式检查器",那么这可能会有不同的表现.要在Java中匹配字符串的片段,可以使用该find
方法,在此处详细描述:
Java Regex中matches()和find()之间的区别
问题2:这个正则表达式也不会匹配空字符串""
吗?
不.正则表达式\\d*
会匹配空字符串,但\\d+
不会.星号*
表示零或更多,而加号+
表示一个或多个.请参阅第一个负面测试用例.
问题3:编译正则表达式模式不是更快吗?
是.编译一次正则表达式模式确实更快,而不是每次调用时都是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());
Run Code Online (Sandbox Code Playgroud)
Apu*_*urv 33
您还可以使用Apache Commons中的NumberUtil.isNumber(String str)
还有一个尚未发布的解决方案:
String regex = "\\p{Digit}+"; // uses POSIX character class
Run Code Online (Sandbox Code Playgroud)
Long.parseLong(data)
Run Code Online (Sandbox Code Playgroud)
并捕获异常,它处理减号.
虽然数字的数量是有限的,但这实际上创建了一个可以使用的数据变量,我想,这是最常见的用例.
您必须允许超过一位数(+
符号),如:
String regex = "[0-9]+";
String data = "23343453";
System.out.println(data.matches(regex));
Run Code Online (Sandbox Code Playgroud)
使用正则表达式在性能方面成本很高.尝试将字符串解析为长值是低效且不可靠的,并且可能不是您需要的.
我建议只是检查每个字符是否是一个数字,使用Java 8 lambda表达式可以有效地完成什么:
boolean isNumeric = someString.chars().allMatch(x -> Character.isDigit(x));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
431485 次 |
最近记录: |