剑指offer_53:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。 * 例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 * 但是

版权声明:本文为博主原创文章,未经博主允许不得转载。 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



基础知识:

  1.  + 一次或多次匹配前面的字符或子表达式。例如,"zo+"与"zo"和"zoo"匹配,但与"z"不匹配。+ 等效于 {1,}。扮演的角色是,可重复出现前面的模式。
  2.   * 零次或多次匹配前面的字符或子表达式。例如,zo* 匹配"z"和"zoo"。* 等效于 {0,}。扮演的角色是要么就不出现,要么就出现,二者择其一,其实这儿就是一个选择:if‘.....else
  3.  ? 零次或一次匹配前面的字符或子表达式。例如,"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;
    }

猜你喜欢

转载自blog.csdn.net/u012429555/article/details/90111372
今日推荐