在字符串中找出连续最长的数字串(含“±”号)
输入描述
请在一个字符串中找出连续最长的数字串,并返回这个数字串。
如果存在长度相同的连续数字串,返回最后一个。
如果没有符合条件的字符串,返回空字符串””。
注意:
- 数字串可以由数字”0-9″、小数点”.”、正负号”±”组成,长度包括组成数字串的所有符号。
- “.”、“±”仅能出现一次,”.”的两边必须是数字,”±”仅能出现在开头且其后必须要有数字。
- 长度不定,可能含有空格。
输入描述
一串字符
输出描述
连续最长的数字串(合法)
否则 输出 “”
用例
输入 | 1234567890abcd9.+12345.678.9ed |
输出 | +12345.678 |
说明 | 无 |
解析
- 使用正则表达式匹配出数字即可, 这种方式比直接拆分数组简单很多
这里面有个非常重要的点
1.1 匹配模式 可以写为 ([±]{0,1}\d+\.{0,1}\d+)
1.2 当输入的内容为 1234567890abcd9.+12345.678.999999ed-205 时 匹配结果为+12345.678 长度是10位 但是经过核对发现 678.999999 也是10位 且为合法数字。如果只是简单的使用正则去找的话,估计像上述这个字符串匹配不出来。
1.3 类似于1.2中的这种字符 我逆向进行了匹配来提高匹配情况。我也相信,即使这样做也可能并不能完全找到所有的正确答案。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test2 {
public static void main(String[] args) {
String input = "1234567890abcd9.+12345.678.999999ed-205";
String regex = "([+-]{0,1}\\d+\\.{0,1}\\d+)";// ()括号是匹配表达式 []匹配之内的一个即可
String res = calcResult(regex, input, true);
String reverseRes = calcResult(regex, new StringBuilder(input).reverse().toString(), false);
reverseRes = new StringBuilder(reverseRes).reverse().toString();
// System.out.println(res);
// System.out.println(reverseRes);
if (input.indexOf(res) > input.indexOf(reverseRes)) {
System.out.println(res);
} else {
System.out.println(reverseRes);
}
}
/**
*
* @param regex 匹配模式
* @param input 匹配字符
* @param flag true 正向 false 反向
* @return
*/
public static String calcResult(String regex, String input, boolean flag) {
Pattern p = Pattern.compile(regex);
Matcher matcher = p.matcher(input);
String res = "";
while (matcher.find()) {
if (flag && matcher.group().length() >= res.length()) {
res = matcher.group(); // 正向取后
} else if ((!flag) && matcher.group().length() > res.length()) {
res = matcher.group(); // 反向取前
}
}
return res;
}
}
代码运行示意图