如何检查字符串是否只包含Java中的数字

Cha*_*nya 136 java string

在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

参考文献:

Java正则表达式

Java字符转义序列


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

首先,如果您对此解决方案(或其他)的正确性存在疑问,请运行此测试用例:

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)

  • 请注意,此方法也匹配**Unicode数字**. (4认同)
  • 请注意,这也将匹配诸如“0xAF”、“2.3e-4”和“123L”之类的字符串。 (3认同)
  • 注意导入`org.apache.commons.lang.math.NumberUtils`而不是不推荐使用的'org.apache.commons.lang.NumberUtils`. (3认同)

jlo*_*rdo 8

还有一个尚未发布的解决方案:

String regex = "\\p{Digit}+"; // uses POSIX character class
Run Code Online (Sandbox Code Playgroud)


Nim*_*sky 6

Long.parseLong(data)
Run Code Online (Sandbox Code Playgroud)

并捕获异常,它处理减号.

虽然数字的数量是有限的,但这实际上创建了一个可以使用的数据变量,我想,这是最常见的用例.

  • 如果它是一个包含比Integer更多的数字的字符串可以支持会发生什么? (4认同)
  • 我会继续说这只要你促进与支撑位的数量有限的答案:-)除非你强调的是作为答案的限制(我不认为这是不合理的** - 实用性应观察).事实上我认为你提出的建议是一个有用的答案,并且我自己也考虑过了 (4认同)
  • 如果它是包含比Long更多数字的字符串可以支持会发生什么? (3认同)

Car*_*ini 5

您必须允许超过一位数(+符号),如:

String regex = "[0-9]+"; 
String data = "23343453"; 
System.out.println(data.matches(regex));
Run Code Online (Sandbox Code Playgroud)


Max*_*ysh 5

使用正则表达式在性能方面成本很高.尝试将字符串解析为长值是低效且不可靠的,并且可能不是您需要的.

我建议只是检查每个字符是否是一个数字,使用Java 8 lambda表达式可以有效地完成什么:

boolean isNumeric = someString.chars().allMatch(x -> Character.isDigit(x));
Run Code Online (Sandbox Code Playgroud)

  • @MaxMalysh 很好的答案!`Character.isDigit(x)` 可以进一步简化为 `Character::isDigit`。 (2认同)