表示数值的字符串+正则表达式

表示数值的字符串

http://www.nowcoder.com/questionTerminal/6f8c901d091949a5837e24bb82a731f2

    // 方法2: 使用正则表达式
    // 题目解析: 题目要求进行数值字符串的匹配,一共有三种数值字符串,分别是整数/小数/科学浮点数
    // 其中科学浮点数以E/e为界,左侧为小数/整数部分,右侧为整数部分,因此构建整数和小数的正则表
    // 达式,即可求解此题.
    // 思路: 和编译原理中构建DFA(Deterministic Finite Automation)确定性有穷自动机类似
    // 不同的是本方法中构建的是DFA的简单形式,而构建DFA的复杂工作则交给Java内建类的方法去实现.
    // 匹配整数的正则表达式为:[+-]?\\d+,匹配小数的正则表达式为:[+-]?\\d*\\.\\d+,PS:本题中"-.123"也算小数
    // 因此将两者合并可得匹配整数/小数的正则表达式为:[+-]?(\\d*\\.)?\\d+,同样可以得到浮点数匹配的部分
    // 附加到此表达式尾部,即:([eE][+-]?\\d+)?,即最终正则表达式为:^[+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?$
    // 括号中的"?:"是为了不去捕获当前括号分组匹配的字符串,也不对其分组,减小运算量.
    // 时间复杂度: 未知
    // 空间复杂度: 未知
    private static Matcher m = Pattern.
        compile("^[+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?$").matcher("");

    public boolean isNumeric(char[] str) {
        // 此代码会多次申请Pattern对象,因此将Matcher对象提出作为私有静态对象,减小开销
//        String regex = "^[+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?$";
//        regex = "^[+-](?:\\d*\\.)?\\d+(?:[eE][+-]\\d+)?$";
//        return Pattern.matches(regex, new String(str));
        return m.reset(new String(str)).matches();
    }
全部评论

相关推荐

10-17 16:07
门头沟学院 Java
牛牛大你18号:在汇报,突然弹出来,,领导以为我在准备跳槽,刚从领导办公室谈心出来
点赞 评论 收藏
分享
已老实求offer😫:有点像徐坤(没有冒犯的意思哈)
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务