如何检查一个字符串在 Java 中是否只包含数字

在 JavaforString 类中有一个叫做 match 的方法,如何使用这个方法来检查我的字符串是否使用正则表达式只有数字。我尝试用下面的例子,但结果都是错误的。

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));
602607 次浏览
Long.parseLong(data)

并捕捉异常,它处理负号。

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

试试看

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

或者

String regex = "\\d+";

根据 Java正则表达式+的意思是“一次或多次”,而 \d的意思是“一个数字”。

注意: “ double 反斜杠”是一个 逃逸程序来获得一个反斜杠-因此,java 字符串中的 \\d给出了实际的结果: \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));

问题一:

是否有必要将 ^$添加到正则表达式中,以使其不匹配“ aa123bb”?

没有。在 java 中,matches方法(在问题中指定的)匹配一个完整的字符串,而不是片段。换句话说,没有必要使用 ^\\d+$(即使它也是正确的)。请看最后一个阴性测试案例。

请注意,如果您使用在线“正则表达式检查器”,那么这可能会有不同的行为。要在 Java 中匹配字符串的片段,可以使用 find方法,详细描述如下:

JavaRegex 中 match ()和 find ()之间的区别

问题2:

这个正则表达式是否也匹配空字符串 ""? *

没有。正则表达式 \\d*将匹配空字符串,但是 \\d+不匹配。恒星 *表示0或更多,而加号 +表示1或更多。请看第一个阴性测试案例。

问题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());

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

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

您还可以使用 Apache Commons 中的 IsNumber (String str)

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

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

就性能而言,使用正则表达式代价高昂。尝试将字符串解析为长值是低效和不可靠的,并且可能不是您所需要的。

我的建议是简单地检查每个字符是否是一个数字,使用 Java8 lambda 表达式可以有效地完成哪些工作:

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()
}

试试这部分代码:

void containsOnlyNumbers(String str)
{
try {
Integer num = Integer.valueOf(str);
System.out.println("is a number");
} catch (NumberFormatException e) {
// TODO: handle exception
System.out.println("is not a number");
}


}

在 Java for String类中,有一个名为 matches()的方法。在此方法的帮助下,您可以验证正则表达式和字符串。

String regex = "^[\\d]{4}$";
   

String value = "1234";


System.out.println(data.matches(value));

上述正则表达式的解释是:-

  • ^-指示正则表达式的开始。

  • []-在这里面你必须描述你自己的情况。

  • \\\d-只允许数字。可以在括号内使用’d’或0-9,两者是相同的。

  • {4}-这个条件允许正好4位数字。你可以根据你的需要改变数字。

  • $-表示正则表达式的结束。

注意: 您可以删除 {4}并指定 +表示一次或多次,或者 *表示零次或多次,或者 ?表示一次或零次。

如需更多参考,请浏览此网站: https://www.rexegg.com/regex-quickstart.html

正则表达式

我会用这个正则表达式来表示整数:

^[-1-9]\d*$

这也适用于其他编程语言,因为它更加具体,而且不会对不同的编程语言如何解释或处理正则表达式做出任何假设。

用 Java 也行

\\d+

有关 ^ 和 $的问题

正如 @ 维京史蒂夫在 java 中指出的,match 方法匹配的是一个完整的字符串,而不是字符串的一部分。换句话说,没有必要使用 ^ d + $(尽管它是正则表达式的官方方式)。

联机正则表达式检查器更为严格,因此它们的行为与 Java 处理正则表达式的方式不同。

请参考 org.apache.commans.lang3.StringUtils

    public static boolean isNumeric(CharSequence cs) {
if (cs == null || cs.length() == 0) {
return false;
} else {
int sz = cs.length();


for(int i = 0; i < sz; ++i) {
if (!Character.isDigit(cs.charAt(i))) {
return false;
}
}


return true;
}
}