Java如何通过正则表达式去除字母关联数字,提取合规数字字符串
原有代码的问题定位
- 正则匹配规则仅支持纯整数识别,完全没覆盖带小数点的小数场景,遇到
25.46这类内容时,会拆分出独立的数字片段,丢失小数点结构 - 匹配循环中没有做分组分隔:抓到每个数字片段后直接拼接到结果里,既没有把同组内仅靠空格分隔的零散数字做合并,也没有在被字母文本隔开的不同组之间添加单空格分隔,最终导致所有片段堆成无间隔的长串,比如输出
234452546
正确实现思路
按照需求拆解成4步处理,完全匹配输出规则:
- 剔除字母关联数字:全局匹配所有紧跟在单词字符(字母、下划线等)后面的数字序列,直接替换为空,比如把
CH2里和H绑定的尾缀数字2删掉,剩下无关联的独立数字 - 拆分独立数值组:按“非数字、非小数点、非空白”的内容做切分,只要是被字母类文本隔开的数值内容,就划分为不同的独立组
- 合并组内内容:对每个独立组,删掉组内所有的空白字符,把组内零散的数字、小数点直接拼接成完整的数值片段
- 组间统一分隔:把所有非空的组内容,用单个空格连接,保证不同组之间只有一个空格间隔
可直接运行的代码实现
static String getNumber(String textString) { // 剔除所有紧跟在字母/单词后的关联数字,如CH2中的2 String cleanedText = textString.replaceAll("(?<=\\w)\\d+", ""); // 按非数字、非小数点、非空白的字符切分,得到独立数值组 String[] numberGroups = cleanedText.split("[^\\d.\\s]+"); StringBuilder result = new StringBuilder(); for (String group : numberGroups) { // 删除组内所有空白字符,合并零散数字 String mergedGroup = group.replaceAll("\\s+", ""); if (!mergedGroup.isEmpty()) { // 非空组之间用单个空格分隔 if (result.length() > 0) { result.append(" "); } result.append(mergedGroup); } } return result.toString(); }
实际测试效果
- 输入
String textString = "Value for CH2 234 45 HH 2546";,输出23445 2546,和预期完全一致 - 输入
String textString = "Value for CH2 234 45 HH 25.46";,输出23445 25.46,完整保留小数结构,满足补充需求
内容的提问来源于stack exchange,提问作者Nitin Thakor
相关产品推荐
相关产品推荐

