剑指Offer20_表示数值的字符串

20 表示数值的字符串

image-20191027150227684

[] : 字符集合
() : 分组
? : 重复 0 ~ 1 次

+ : 重复 1 ~ n 次

* : 重复 0 ~ n 次
. : 任意字符
\. : 转义后的 .
\d : 数字

"[+-]?\\d* (\\.\\d+)?([eE][+-]?\\d+)"			错误的,空格也算一个字符别随便打空格
"[+-]?\\d*(\\.\\d+)?([eE][+-]?\\d+)?"
public boolean judge(String str) {
        if (str == null || str.length() == 0)  //一定是|| 而不是&& str="";不为空,长度为0
            return false;
        return str.matches("[+-]?\\d*(\\.\\d+)?([eE][+-]?\\d+)?");

    }
}


public class 剑指Offer_20_表示数值的字符串 {
    public static boolean isNumber(String s) {
        if (s == null) return false;
        //首先要 去除 收尾空格  因为" 1.323     "也是true
        //////////////
        s = s.trim();
        char[] chars = s.toCharArray();
        //定义numSee,dotSee,eSee
        boolean numSee = false, dotSee = false, eSee = false;
        for (int i = 0; i < chars.length; i++) {
            if (chars[i] >= '0' && chars[i] <= '9') {
                numSee = true;
            } else if (chars[i] == '.') {
                //.之前不能出现.或者e
                if (dotSee || eSee) return false;
                dotSee = true;
            } else if (chars[i] == 'E' || chars[i] == 'e') {
                //e之前不能出现e,必须出现数
                if (eSee || !numSee) return false;
                //重置numSeen,排除123e或者123e+的情况,确保e之后也出现数
                numSee = false;
                eSee = true;
            } else if (chars[i] == '+' || chars[i] == '-') {
                //+-出现在0位置或者e/E的后面第一个位置才是合法的
                if (i != 0 && chars[i - 1] != 'e' && chars[i - 1] != 'E') return false;
            } else {
                //其他不合法字符
                return false;
            }
        }
        return numSee;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_45399846/article/details/107558423