表示数值的字符串-Java实现
表示数值的字符串
http://www.nowcoder.com/questionTerminal/6f8c901d091949a5837e24bb82a731f2
个人题解,可能存在错误,有的话请狠批。
自定义匹配规则
public static boolean isNumeric(char[] str) { if (str == null || str.length == 0) return false; //科学计数法aEb中 b必须是整数,且不为0 boolean word = false;//统计+或-是否出现过 boolean e = false;//统计e或E是否出现过 boolean node = false; //统计.出现是否出现过 for (int i = 0; i < str.length; i++) { //字符不能是其它非法字符 if (str[i] == '+' || str[i] == '-') { //确保+前面要么空,要么是e if (i != 0 && str[i - 1] != 'e' && str[i - 1] != 'E') return false; } else if (str[i] == '.') { //判断.是否在e后面,e后面不能出现小数 if (e == true) return false; //.后面必须接数字 if (i + 1 >= str.length || str[i + 1] > '9' || str[i + 1] < '0') return false; if (node == true) { //在一个数字中出现多个. return false; } else { node = true; } } else if (str[i] == 'e' || str[i] == 'E') { //确保e、E是第一次出现 if (e == true) return false; else { //确保前一位是数字和下一位有字符 if (str[i - 1] >= '0' && str[i - 1] <= '9' && i + 1 < str.length) { e = true; } else { return false; } } } else if (str[i] >= '0' && str[i] <= '9') { if (i == 1 && str[0] == '0') { return false;//不能出现0xxxxx这种情况 } else if (e == true && str[i - 1] == '0' && (str[i - 2] == 'e' || str[i - 2] == 'E')) { return false; } } else { //非法字符 return false; } } return true; }
正则表达式
我看很多答案没有考虑第一个数字为0的情况,0100是非法的吧(自认为)。
public static boolean isNumeric2(char[] str) { //使用正则表达式匹配 String strs = new String(str); //[\\-\\+]?首字符可以出现+、-,也可以不出现,接下来就是数字,第一个要么是1~9,要么是0,0后面必须配上. //([0]\\.\\d+|[1-9]\\d*(\\.\\d+)?|\\.\\d+)这里面有3个选项,以|为间隔, //选项1:[0]\\.\\d+ 第一个数字为0的话,后面必须接小数点.和任意整数 //选项2:[1-9]\\d*(\\.\\d+)? 第一个数字是1~9,后面可以接整数 或者接小数部分 //选项3:直接是小数部分 //[eE][\+\-]?[1-9]\d* 对于指数部分,我还是秉着首个数字不能为0的情况 String pattern = "[\-\+]?([0]\.\d+|[1-9]\d*(\.\d+)?|\.\d+)([eE][\+\-]?[1-9]\d*)?"; return Pattern.matches(pattern, strs); }