原文地址:https://www.nowcoder.com/questionTerminal/6f8c901d091949a5837e24bb82a731f2
作者:傻傻傻傻
思路一:匹配模式:(A)(.B)(e|EC)或者(.B)(e|EC)
其中A代表整数部分,B代表小数部分,C代表指数部分。
A和C都可以‘+’或者‘—’开头的0~9的数位串,B也是0~9的数位串,但是前面不能有正负号。
代码如下:
public class IsNumberic {
static int index=0;
public static boolean isNumeric(char[] str) {
if(str==null){
return false;
}
boolean flag=scanInteger(str);
if(index<str.length &&str[index]=='.'){
index++;
flag=scanUnsignedInterger(str)||flag;
}
if(index<str.length &&(str[index]=='E'||str[index]=='e')){
index++;
flag=flag&&scanInteger(str);
}
return flag&&index==str.length;
}
//匹配数字,相当于模式中的B部分
public static boolean scanUnsignedInterger(char[] str){
int start=index;
int length=str.length;
while(index<length && str[index]>='0' &&str[index]<='9'){
index++;
}
return start<index;
}
//扫描字符串中的正负号,相当于A,C部分
public static boolean scanInteger(char [] str){
if(index<str.length && (str[index]=='+'||str[index]=='-')){
index++;
}
return scanUnsignedInterger(str);
}
public static void main(String [] args){
char [] str=new char[]{'1','2','3','.','4','5','e','+','6'};
boolean s=isNumeric(str);
System.out.println(s);
}
}
思路二:使用正则表达式匹配
[] : 字符集合匹配包含的任一字符。
() : 分组
? : 0 ~ 1 次匹配前面的字符或子表达式。
+ : 1 ~ n 次匹配前面的字符或子表达式。
* : 0 ~ n 次匹配前面的字符或子表达式。
. : 任意字符
\\. : 转义后的 .
\\d : 数字。因为\d为数字字符匹配,等效于[0-9],\的前面需要转义
链接:https://www.nowcoder.com/questionTerminal/6f8c901d091949a5837e24bb82a731f2
来源:牛客网
public class Solution {
public boolean isNumeric(char[] str) {
String string = String.valueOf(str);
return string.matches("[+-]?\\d*(\\.\\d+)?([eE][+-]?\\d+)?");
}
}