表示数值的字符串+正则表达式
表示数值的字符串
http://www.nowcoder.com/questionTerminal/6f8c901d091949a5837e24bb82a731f2
// 方法2: 使用正则表达式
// 题目解析: 题目要求进行数值字符串的匹配,一共有三种数值字符串,分别是整数/小数/科学浮点数
// 其中科学浮点数以E/e为界,左侧为小数/整数部分,右侧为整数部分,因此构建整数和小数的正则表
// 达式,即可求解此题.
// 思路: 和编译原理中构建DFA(Deterministic Finite Automation)确定性有穷自动机类似
// 不同的是本方法中构建的是DFA的简单形式,而构建DFA的复杂工作则交给Java内建类的方法去实现.
// 匹配整数的正则表达式为:[+-]?\\d+,匹配小数的正则表达式为:[+-]?\\d*\\.\\d+,PS:本题中"-.123"也算小数
// 因此将两者合并可得匹配整数/小数的正则表达式为:[+-]?(\\d*\\.)?\\d+,同样可以得到浮点数匹配的部分
// 附加到此表达式尾部,即:([eE][+-]?\\d+)?,即最终正则表达式为:^[+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?$
// 括号中的"?:"是为了不去捕获当前括号分组匹配的字符串,也不对其分组,减小运算量.
// 时间复杂度: 未知
// 空间复杂度: 未知
private static Matcher m = Pattern.
compile("^[+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?$").matcher("");
public boolean isNumeric(char[] str) {
// 此代码会多次申请Pattern对象,因此将Matcher对象提出作为私有静态对象,减小开销
// String regex = "^[+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?$";
// regex = "^[+-](?:\\d*\\.)?\\d+(?:[eE][+-]\\d+)?$";
// return Pattern.matches(regex, new String(str));
return m.reset(new String(str)).matches();
}
韶音科技公司氛围 647人发布
