表示数值的字符串+正则表达式
表示数值的字符串
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(); }