168

在Java for String 类中有一个称为matches 的方法,如何使用此方法使用正则表达式检查我的字符串是否只有数字。我尝试了以下示例,但它们都返回了错误的结果。

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));
4

9 回答 9

388

尝试

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

或者

String regex = "\\d+";

根据 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));

问题一:

是不是有必要添加^$到正则表达式,所以它不会匹配 "aa123bb" ?

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

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

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

问题2:

这个正则表达式不会也匹配空字符串""吗?*

不会。正则表达式\\d*会匹配空字符串,但\\d+不会。星*号表示零或多个,而加号+表示一或多个。请参阅第一个否定测试用例。

问题 3

编译正则表达式模式不是更快吗?

是的。编译一次正则表达式模式确实更快,而不是每次调用matches,因此如果性能影响很重要,那么 aPattern可以像这样编译和使用:

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());
于 2013-02-27T11:53:19.143 回答
35

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

于 2013-02-27T11:53:50.023 回答
14

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

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

boolean isNumeric = someString.chars().allMatch(x -> Character.isDigit(x));
于 2016-02-02T10:07:58.590 回答
11

另一种尚未发布的解决方案:

String regex = "\\p{Digit}+"; // uses POSIX character class
于 2013-02-27T12:05:59.240 回答
7
Long.parseLong(data)

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

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

于 2013-02-27T11:52:46.460 回答
7

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

String regex = "[0-9]+"; 
String data = "23343453"; 
System.out.println(data.matches(regex));
于 2013-02-27T11:53:37.467 回答
2

我们可以使用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
于 2016-09-12T10:50:58.717 回答
2

根据 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()
}
于 2017-03-29T16:13:16.247 回答
-1

试试这部分代码:

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");
    }

}
于 2018-03-23T16:21:25.490 回答