刷题中遇到的一个思路,通过正则表达式来匹配字符串,省去了很多繁琐的条件判断,代码简洁。
但唯一的缺点就是不易读。
因此,特意记录学习一下。
1. 题目中“数值”的概念
数值(按顺序)可以分成以下几个部分:
(1)若干空格;
(2)一个小数或整数;
(3)(可选)一个 ‘e’ 或 ‘E’ ,后面跟着一个 整数;
(4)若干空格;
其中,整数和小数的定义分别为:
小数(按顺序)可以分成以下几个部分:
(1)(可选)一个符号字符(‘+’ 或 ‘-’);
(2)下述格式之一:
① 至少一位数字,后面跟着一个点 ‘.’;
② 至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字;
③ 一个点 ‘.’ ,后面跟着至少一位数字。、整数(按顺序)可以分成以下几个部分:
(1)(可选)一个符号字符(‘+’ 或 ‘-’);
(2)至少一位数字。
2. 正则表达式描述
根据上述的定义,可以列出每一种情况下的小数匹配模式:
描述 | 正则表达式 |
至少一位数字,后面跟着一个点 ‘.’ | “\d+\.{1}” |
至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字 | “\d+\.{1}\d+” |
一个点 ‘.’ ,后面跟着至少一位数字 | “\.{1}\d+” |
3. Java 代码
// 正则表达式匹配是否为数值
public static boolean isNumber(String s) {
boolean ans = false;
s = s.trim(); // 去除字符串前后的空格;
String pattern = "[+-]?((\\d+\\.?\\d*){1}|(\\d+\\.?){1}|(\\.{1}\\d+){1}){1}([eE]{1}[+-]?\\d+)?";
if(s.matches(pattern)) {
ans = true;
}
return ans;
}