两种方法,一种是状态自动机,一种是正则表达式,都不会直接copy了,还有一种模拟的方法
记录一下正则表达式的写法
正则表达式测试网站
题意:一个整数或者小数 +(可选)(e/E + 一个整数)
几部分分别定义
- 一个整数
一个可选的符号位,至少一个数字位
[+-]?\d+
- 一个小数
//三种小数
第一种:一个可选的符号位,至少一位数字,小数点
[+-]?\d+.
第二种:一个可选的符号位,至少一位数字,小数点,至少一位数字
[+-]?\d+.\d+
上面两种其实可以合并为一个
[+-]?\d.\d*
第三种:小数点,至少一位数字
[+-]?.\d+
三种小数都符合题意,或起来
[+-]?( (\d+.\d*) | (.\d+) )
因此第一部分可以表示为
[+-]?( (\d+) | (\d+.\d*) | (.\d+) )
第二部分,整体为可选,则表达式最后有一个?
一个e/E,一个整数(一个可选的符号位,至少一位数字位) 整体可选
([eE][+-]?\d+)?
- 上面写错了,因为不要他妈的留空格
同时在java中将正则表达式转成字符串形式,要注意\\,不同语言对表达式的转换有不同的写法,同时匹配用到的类为Pattern
其实上面的式子还可以化简,取决于定义,将第一部分可以这么定义:
一个可选的符号位,一个整数+可选的.小数 或者 直接.小数,再接指数部分
也就是说将.xxxx看做一个可选择的部分
1
1.111
.111
前两种可以合并
最后通过的解法为
import java.util.regex.*;
class Solution {
public boolean isNumber(String s) {
String regular = "([+-]?((\\d+)|(\\d+\\.\\d*)|(\\.\\d+)))([eE][+-]?\\d+)?";
Pattern p = Pattern.compile(regular);
return p.matcher(s).matches();
}
}