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

 更新时间:2026年05月12日 09:38:58   作者:蓝鲸软工  
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] 表示一个数字字符(0到9)。
  • + 表示前面的内容可以出现一次或多次。
  • $ 表示字符串的结束。

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

情况二:允许负整数

正则表达式

^-?[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(因为这里允许了负号,但不包括正号)
    }
}

解释:

  • -? 表示可选的负号。这里的问号表示前面的内容可以出现0次或1次。

注意,这个正则表达式只允许负号,而不包括正号(比如"+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(小数点后必须有数字)
    }
}

解释:

  • [0-9]+ 表示至少一个数字。
  • (\\.[0-9]+)? 表示可选的小数部分,其中:
    • \\. 表示转义字符“.”(因为在Java中需要用双斜杠来表示单个斜杠)。
    • [0-9]+ 表示小数点后至少有一个数字。

四、验证整数或小数

有时候,我们需要同时支持整数和小数的情况。比如,"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]*)? 表示可选的小数部分:
    • . 前面的斜杠是转义符。
    • [0-9]* 表示小数点后可以有零个或多个数字。

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

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

正则表达式

^[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正则表达式验证数字字符串内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java观察者模式之实现对象间的一对多依赖

    Java观察者模式之实现对象间的一对多依赖

    这篇文章主要介绍了Java观察者模式之实现对象间的一对多依赖的方法,Java观察者模式是一种行为型设计模式,用于实现对象之间的消息传递和通信,文中有详细的实现步骤和代码示例,,需要的朋友可以参考下
    2023-05-05
  • 全面汇总SpringBoot和SpringClould常用注解

    全面汇总SpringBoot和SpringClould常用注解

    Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能,这篇文章就带你来了解一下
    2021-08-08
  • Java Web开发入门书籍实例解析(总结一)

    Java Web开发入门书籍实例解析(总结一)

    从事Java Web开发这一段时间来,对Java 面向对象的思想和MVC开发模式可以说已经熟悉了。我当前参与的项目使用的框架是Spring、SpringMVC、Hibernate。下面脚本之家小编给大家整理一篇教程帮助大家学习javaweb相关知识,感兴趣的朋友可以参考下
    2016-03-03
  • 深入探索SpringBoot3中Profiles的多环境配置

    深入探索SpringBoot3中Profiles的多环境配置

    在当今复杂的软件开发领域,一个应用往往需要在开发、测试、生产等多个环境中运行,下面我们就来深入探索一下SpringBoot3中Profiles的多环境配置吧
    2025-12-12
  • 详解JDK中ExecutorService与Callable和Future对线程的支持

    详解JDK中ExecutorService与Callable和Future对线程的支持

    这篇文章主要介绍了详解JDK中ExecutorService与Callable和Future对线程的支持的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • Springboot中redis使用lettuce连接池经常连接超时问题分析及解决

    Springboot中redis使用lettuce连接池经常连接超时问题分析及解决

    文章主要介绍了在Spring Boot项目中,使用Lettuce作为Redis客户端时遇到的问题——连接在一段时间后会自动掉线,问题的根源在于Lettuce的空闲连接处理机制,文章提供了Spring Boot 2.3及以上版本的解决方案,即通过配置解决,或者排除Lettuce并采用Jedis
    2025-11-11
  • mybatis分页效果实现代码

    mybatis分页效果实现代码

    这篇文章主要为大家详细介绍了mybatis分页效果的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Java前后端任意参数类型转换方式(Date、LocalDateTime、BigDecimal)

    Java前后端任意参数类型转换方式(Date、LocalDateTime、BigDecimal)

    这篇文章主要介绍了Java前后端任意参数类型转换方式(Date、LocalDateTime、BigDecimal),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Java8 Zip 压缩与解压缩的实现

    Java8 Zip 压缩与解压缩的实现

    这篇文章主要介绍了Java8 Zip 压缩与解压缩的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • mybatis集成到spring的方式详解

    mybatis集成到spring的方式详解

    这篇文章主要介绍了mybatis是如何集成到spring的,将mybatis集成到spring之后,就可以被spring的ioc容器托管,再也不用自己创建SqlSessionFactory 、打开SqlSession等操作,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-05-05

最新评论