表示数值的字符串(正则表达式匹配)

这是一篇关于如何使用正则表达式在Java中匹配表示数值的字符串的博客。作者通过分析剑指Offer20题,指出可以利用String.matches()函数解决此问题。文章强调了正则表达式的灵活性和易错性,并建议将数字分为正常数字和科学计数法数字两种情况进行匹配。文章提供了Java代码示例,并提到完善匹配规则和测试样例的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:剑指offer20题。

题解


字符串匹配!用正则表达式来做

Java中String类支持正则表达式匹配 String.matches()函数,这道题恰好就可以用正则匹配来做。
当然手动地设计好匹配规则,自己写匹配也行,但是这样做题速度会更慢。
不要想什么简单方法,一步步来就行。

规则

  • 根据数据样例,先梳理清楚能表示数值的字符串有哪些情况,然后指定正则表达式。
  • 正则表达式比较灵活,而且容易出错,一旦出错都不知道怎么检查,建议将情况划分后分别写正则表达式。

分类、匹配(进入正题):

  • 我这里把数字分为正常数字(不含e/E)科学计数法数字
  • 分别制定规则进行匹配,匹配成功即返回true。
  • 当然数据样例也没包括所有的数据组成情况,需要我们自己再完善匹配规则。

Java代码

//class
    public boolean isNumber(String s) {
        //至少有一个数字,e前要有数字
        if (s == null || s.length() == 0 || !s.matches(".*\\d.*")) {//必须包含数字
            return false;
        }
        s = s.trim();//空格处理
        if (s.contains("e") || s.contains("E")) {//包含e,科学计数法
            if (s.matches("[^\\d]*[e|E].*")) {//e前无数字
                return false;
            }
            return (s.matches("^[\\+-]?\\d*\\.?\\d*[e|E][\\+-]?\\d+$"));
        } else {//不包含e,正常数字
            return s.matches("^[\\+-]?(\\d*\\.?)\\d*$");
        }
    }

以下可不看


这道题逃不开规则的制定,而且是个很花时间的活儿,毕竟测试样例中奇葩样例多的是。
想要一次AC还是比较困难。(自己花了很多时间才调通程序)
没有接触过正则表达式的童鞋可以简单去学习一下。

补充:正则匹配部分的解释

通配符(次数):
? 匹配01* 匹配0次或任意次
+ 匹配1次或任意次
. 匹配任意字符

语法:
[\\d] 匹配数字字符
[0-9] 匹配0~9中任意的数字,同上
^ 匹配字符串头部位置
$ 匹配字符串尾部位置

转义符:
特殊字符的匹配需要进行转义处理,java正则匹配中转义比较特殊要用\\,有兴趣的可以查一下
. 转义为 \\. (匹配任意字符)
+ 转义为 \\+

测试数据

    public void test() {
        System.out.println(isNumber("1 "));
        System.out.println(isNumber(".1 "));
        System.out.println(isNumber("3."));
        System.out.println(isNumber("+100"));
        System.out.println(isNumber("5e2"));
        System.out.println(isNumber("-1E-16"));
        System.out.println(isNumber("0123"));
        System.out.println(isNumber("46.e3"));
        System.out.println(isNumber(".2e81"));
        System.out.println(isNumber("1.431352e7"));
        System.out.println(isNumber("-1E-16"));
        System.out.println();
        System.out.println(isNumber(".e3"));
        System.out.println(isNumber("."));
        System.out.println(isNumber("-."));
        System.out.println(isNumber("12e"));
        System.out.println(isNumber("1a3.14"));
        System.out.println(isNumber("+-5"));
        System.out.println(isNumber("12e+5.4"));
    }

END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值