# 题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
数值(按顺序)可以分成以下几个部分:
- 若干空格
- 一个 小数 或者 整数
- (可选)一个 'e' 或 'E' ,后面跟着一个 整数
- 若干空格
小数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符('+' 或 '-')
- 下述格式之一:
- 至少一位数字,后面跟着一个点 '.'
- 至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
- 一个点 '.' ,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符('+' 或 '-')
- 至少一位数字
部分数值列举如下:
["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]
部分非数值列举如下:
["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]
提示:
1 <= s.length <= 20
s 仅含英文字母(大写和小写),数字(0-9),加号 '+' ,减号 '-' ,空格 ' ' 或者点 '.'
。
# 测试用例
示例 1:
- 输入:
s = "0"
- 输出:
true
示例 2:
- 输入:
s = "e"
- 输出:
false
示例 3:
- 输入:
s = "."
- 输出:
false
示例 4:
- 输入:
s = " .1 "
- 输出:
true
# 代码实现
字符串从头到尾,因为我们要字符串完全匹配,所以要配置
^
和$
定义匹配整个字符串(\+|\-)?
表示正负号,可以有,但有的话只能有一个小数分情况考虑,因为
.1, 0.1, 1.
三种情况都是符合要求的把
0.1, 1.
作为一个情况考虑 ——(\d+(\.\d*)?)
—— 小数点前必须有数字,后面必须接挨着有.
,后面可以没有数字,所以用*
,同时,小数点和数字这个组合可以有,但是有的话只能有一个(.1.2.3
这种是不符合的),所以使用?
来匹配第二种情况匹配
.1
——(\.\d+)
,除了.11311
这种形式,其他状态都是不匹配的最后就是e的情况 ——
([eE][+\-]?\d+)?
表示匹配一个e(或 E),紧接着一个
+
或者-
号以及一个或多个数字,同时这个整体也是要么有一个,要么就没有,所以使用?
(1e21e21e2
这种是不符合的)
正则匹配
/**
* @param {string} s
* @return {boolean}
*/
var isNumber = function(s) {
s = s.trim();
var reg = /^[+\-]?((\d+(\.\d*)?)|(\.\d+))([eE][+\-]?\d+)?$/g;
return reg.test(s);
};
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9