java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java正则表达式验证数字字符串

Java如何用正则表达式验证数字字符串详解

作者:蓝鲸软工

Java的正则表达式通过包提供了强大的字符串处理能力,无论是简单的字符串验证,还是复杂的模式提取,Pattern和Matcher都能满足需求,这篇文章主要介绍了Java如何用正则表达式验证数字字符串的相关资料,需要的朋友可以参考下

前言

今天咱们要聊一个看似简单却暗藏玄机的话题——Java中使用正则表达式来验证数字字符串。这个话题听起来好像没啥难度,但实际操作中总是会遇到各种“坑”,尤其是当你第一次尝试用正则表达式时,可能会觉得这些小东西有点“调皮”。别担心,闫工今天就带着大家一起来征服这个“小山头”!

一、什么是数字字符串?

在开始之前,咱们先明确一下什么是数字字符串。简单来说,数字字符串就是只包含数字字符的字符串,比如"123""456789"等等。但是,在实际开发中,我们可能会遇到以下几种情况:

  1. 纯整数:如"123""-456"
  2. 小数:如"12.34""-56.78"
  3. 带符号的数字:如"+789""-0"

每种情况对应的正则表达式都会有所不同,所以咱们得逐一分析。

二、验证纯整数

首先,我们来验证一个字符串是否是纯整数。这里又分为两种情况:

情况一:只允许非负整数(即不带符号的正整数)

正则表达式

^[0-9]+$

代码示例

public class NumberValidator {
    public static boolean isNonNegativeInteger(String str) {
        String regex = "^[0-9]+$";
        return str.matches(regex);
    }

    public static void main(String[] args) {
        System.out.println(isNonNegativeInteger("123"));   // true
        System.out.println(isNonNegativeInteger("abc"));   // false
        System.out.println(isNonNegativeInteger("-456"));  // false
    }
}

解释:

所以,这个正则表达式的意思是:从头到尾全是数字字符,并且至少有一个数字字符

情况二:允许负整数

正则表达式

^-?[0-9]+$

代码示例

public class NumberValidator {
    public static boolean isInteger(String str) {
        String regex = "^-?[0-9]+$";
        return str.matches(regex);
    }

    public static void main(String[] args) {
        System.out.println(isInteger("123"));     // true
        System.out.println(isInteger("-456"));    // true
        System.out.println(isInteger("+789"));    // false(因为这里允许了负号,但不包括正号)
    }
}

解释:

注意,这个正则表达式只允许负号,而不包括正号(比如"+789"会被认为是不合法的)。如果我们想同时支持正号和负号,可以稍作修改:

支持正号和负号

正则表达式:^[+-]?[0-9]+$

代码示例:

public class NumberValidator {
    public static boolean isSignedInteger(String str) {
        String regex = "^[+-]?[0-9]+$";
        return str.matches(regex);
    }

    public static void main(String[] args) {
        System.out.println(isSignedInteger("123"));     // true
        System.out.println(isSignedInteger("-456"));    // true
        System.out.println(isSignedInteger("+789"));    // true
        System.out.println(isSignedInteger("abc"));     // false
    }
}

三、验证小数(浮点数)

接下来,咱们来看看如何验证带小数点的数字。这里需要考虑以下几种情况:

  1. 必须包含一个小数点。
  2. 小数点前后必须有至少一个数字。

正则表达式

^[+-]?[0-9]+(\\.[0-9]+)?$

代码示例

public class NumberValidator {
    public static boolean isDecimal(String str) {
        String regex = "^[+-]?[0-9]+(\\.[0-9]+)?$/";
        return str.matches(regex);
    }

    public static void main(String[] args) {
        System.out.println(isDecimal("12.34"));   // true
        System.out.println(isDecimal("-56.78"));  // true
        System.out.println(isDecimal("+789"));    // false(因为没有小数点)
        System.out.println(isDecimal(".9"));      // false(小数点前必须有数字)
        System.out.println(isDecimal("123."));    // false(小数点后必须有数字)
    }
}

解释:

四、验证整数或小数

有时候,我们需要同时支持整数和小数的情况。比如,"123"是合法的,"45.67"也是合法的。

正则表达式

^[+-]?[0-9]+(\\.[0-9]*)?$

代码示例

public class NumberValidator {
    public static boolean isNumber(String str) {
        String regex = "^[+-]?[0-9]+(\\.[0-9]*)?$/";
        return str.matches(regex);
    }

    public static void main(String[] args) {
        System.out.println(isNumber("123"));       // true
        System.out.println(isNumber("-45.67"));   // true
        System.out.println(isNumber("+89"));      // true
        System.out.println(isNumber(".123"));     // false(小数点前必须有数字)
        System.out.println(isNumber("123."));     // false(小数点后不能没有数字)
    }
}

解释:

五、验证非负整数和非负小数

有时候,我们需要确保数字是非负的(即不带负号)。比如,金额、年龄等场景。

正则表达式

^[0-9]+(\\.[0-9]*)?$

代码示例

public class NumberValidator {
    public static boolean isNonNegativeNumber(String str) {
        String regex = "^[0-9]+(\\.[0-9]*)?$/";
        return str.matches(regex);
    }

    public static void main(String[] args) {
        System.out.println(isNonNegativeNumber("123"));       // true
        System.out.println(isNonNegativeNumber("45.67"));    // true
        System.out.println(isNonNegativeNumber("-89"));      // false
        System.out.println(isNonNegativeNumber("+90"));      // false(因为不允许正号)
    }
}

六、特殊情况处理

在实际应用中,我们可能会遇到以下特殊情况:

  1. 允许科学计数法:比如"1.2e3"或者"-45E+6"

    • 这个场景比较复杂,需要额外的正则表达式来处理。
  2. 不允许前导零:比如"0123"会被认为是非法的。

    • 如果有这个需求,可以在正则表达式中添加检查。
  3. 固定小数位数:比如必须保留两位小数。

    • 这个可以通过调整小数部分的数字个数来实现。

七、常见错误和注意点

  1. 转义字符问题

    • 在Java中,字符串中的正则表达式需要使用双斜杠来表示单个斜杠(如\\.)。
  2. 边界情况

    • 确保小数点前后都有数字。
    • 确保不出现多个小数点(比如"12.34.56"是非法的)。
  3. 符号处理

    • 如果不需要正号或负号,可以去掉相关的部分。
    • 同时支持正号和负号时,确保符号只出现在最前面。

总结

通过以上几种常见的数字验证方式,我们可以根据实际需求选择合适的正则表达式。记住,在编写正则表达式时,要仔细考虑边界情况,并进行充分的测试以确保其正确性。

附:Java正则表达式提取字符串中的数字

直接上代码:

String reg = "\\D+(\\d+)$";    //提取字符串末尾的数字:封妖塔守卫71 == >> 71  
String s = monster.getMonsterName();  
Pattern p2 = Pattern.compile(reg);  
Matcher m2 = p2.matcher(s);  
int historyHighestLevel = 1;
if(m2.find()){  
    historyHighestLevel = Integer.parseInt(m2.group(1));
    System.out.println(m2.group(1));  // 组提取字符串  
}

相似的我也可以提起字符串中间的一个或多个数字:

reg = "\\D+(\\d+)\\D+";  // 提起字符串中间的数字
reg = "\\D+(\\d+)\\D+(\\d+)\\D*";  // 提起字符串中间的多个数字

再看一例子:

String sqlServerDateTime = "CAST(0x993902CE AS DATETIME)";  
        String reg = "CAST\\((0x[0-9-a-f-A-F]+) AS DATETIME\\)";    // ( 为特殊字符,需要用 \\ 转义
        Pattern p = Pattern.compile(reg); 
        Matcher m = p.matcher(sqlServerDateTime);
        if(m.find()){
            rawData = m.group(1);
            System.out.println(rawData);  // 组提取字符串 0x993902CE  
        }

2. 匹配所有图片格式:

String reg = ".*\\.(?i)(jpg|jpeg|gif|bmp|png)";
if(filePath.matches(reg)){

}

注意 (jpg|jpeg|gif|bmp|png) 和 [a|b] 的区别,一个是多个字符中任意一个,一个是多个字母中任意一个,不要搞混了。

到此这篇关于Java如何用正则表达式验证数字字符串的文章就介绍到这了,更多相关Java正则表达式验证数字字符串内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文