20 表示数值的字符串
[] : 字符集合
() : 分组
? : 重复 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;
}
}