# 题目描述

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。

数值(按顺序)可以分成以下几个部分:

  1. 若干空格
  2. 一个 小数 或者 整数
  3. (可选)一个 'e' 或 'E' ,后面跟着一个 整数
  4. 若干空格

小数(按顺序)可以分成以下几个部分:

  1. (可选)一个符号字符('+' 或 '-')
  2. 下述格式之一:
  • 至少一位数字,后面跟着一个点 '.'
  • 至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
  • 一个点 '.' ,后面跟着至少一位数字

整数(按顺序)可以分成以下几个部分:

  1. (可选)一个符号字符('+' 或 '-')
  2. 至少一位数字

部分数值列举如下:

["+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