版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012429555/article/details/90111372
题目:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
* 例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。
* 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
了解直接表达式的基础知识:
正则表达式定义了字符串的模式。
正则表达式可以用来搜索、编辑或处理文本。
正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
详细区别请看:https://www.runoob.com/java/java-regular-expressions.html
具体案例应用,邮箱的正则表达式识别:https://blog.csdn.net/u012429555/article/details/51317757
基础知识:
- + 一次或多次匹配前面的字符或子表达式。例如,"zo+"与"zo"和"zoo"匹配,但与"z"不匹配。+ 等效于 {1,}。扮演的角色是,可重复出现前面的模式。
- * 零次或多次匹配前面的字符或子表达式。例如,zo* 匹配"z"和"zoo"。* 等效于 {0,}。扮演的角色是要么就不出现,要么就出现,二者择其一,其实这儿就是一个选择:if‘.....else
- ? 零次或一次匹配前面的字符或子表达式。例如,"do(es)?"匹配"do"或"does"中的"do"。? 等效于 {0,1}。扮演了角色是:使的前面的模式可有可无
代码:
package Chap2;
/*请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
*/
public class isNumeric {
public boolean isNumeric(char[] str) {
//考虑正则表达式:https://www.runoob.com/java/java-regular-expressions.html
//+一次或多次匹配前面的字符或子表达式。例如,"zo+"与"zo"和"zoo"匹配,但与"z"不匹配。+ 等效于 {1,}。
//* 零次或多次匹配前面的字符或子表达式。例如,zo* 匹配"z"和"zoo"。* 等效于 {0,}。
//? 零次或一次匹配前面的字符或子表达式。例如,"do(es)?"匹配"do"或"does"中的"do"。? 等效于 {0,1}。
// [+-]?[0-9]*(\\.[0-9]*)?([eE][+-]?[0-9]+)?
//[+-]? 出现一次或者零次
//[0-9]* 零次或者多次出现
//(\\.[0-9]*)? 当有小数点时,出现零次或者多次,小数点之后的数字,但是这也是可有可无的
//([eE][+-]?[0-9]+)?出现一个或者零次,e/E+(+-)+(0-9)+最后一个加号的意义正负号后的0-9数字必须出现
if (str == null) {
return false;
}
return new String(str).matches("[+-]?[0-9]*(\\.[0-9]*)?([eE][+-]?[0-9]+)?");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
其实这题是考察正则表达式,所以不建议用以下的解法:
下面是比较麻烦的另外一种解法:
public boolean isNumeric_2(char[] str) {
// null或者空字符串不是数字
if (str == null || str.length == 0) {
return false;
}
// 长度只为1,必须是数0~9之间
if (str.length == 1) {
return str[0] >= '0' && str[0] <= '9';
}
boolean hasDot = false;
boolean hasE = false;
boolean hasSign = false;
for (int i = 0; i < str.length; i++) {
if (str[i] == '+' || str[i] == '-') {
// 第二次出现正负号,前一个字符必须是e或者E
if (hasSign && str[i - 1] != 'e' && str[i - 1] != 'E') return false;
// 第一次出现正负号且不在开头,前一个字符也必须是e或者E
if (!hasSign && i > 0 && str[i - 1] != 'e' && str[i - 1] != 'E') return false;
hasSign = true;
} else if (str[i] == '.') {
// 只能出现一次'.',e和E之后不可出现'.'
if (hasDot || hasE) return false;
hasDot = true;
} else if (str[i] == 'e' || str[i] == 'E') {
// e或E后必须有数字
if (i == str.length -1) return false;
// 只能有一个e或者E
if (hasE) return false;
hasE = true;
// 最后判断如果是 +-eE.之外的字符,不匹配
} else if (str[i] < '0' || str[i] > '9') {
return false;
}
}
return true;
}