Java如何正确过滤匹配带计量单位的相关字符串
问题原因分析
你原来的正则存在多处语法错误,无法匹配目标字符串:
- 数字匹配部分
[0_9*]写法错误:方括号内0_9只会匹配0、下划线、9三个字符,额外的*也会被当成普通字符匹配,完全无法识别任意长度的数字串 - 后缀匹配部分
[(GB)(MB)(KB)]错误:方括号是字符集匹配规则,只会匹配括号、G、B、M、K中的单个字符,无法匹配GB/MB这类多字符后缀 - 仅匹配了存储单位后缀,你给出的示例中还包含
AM/PM/ST/ND这类时序/序列后缀,没有纳入匹配规则 - 搭配
find()方法时如果要匹配整个字符串,要么正则首尾加^/$,要么直接用matches()方法更合适
正确实现代码
如果需要匹配你给出的所有示例字符串,调整后的代码如下:
// 正则预编译建议放在循环外,避免重复编译影响性能 Pattern pattern = Pattern.compile("^\\d+(GB|MB|KB|AM|PM|ST|ND)$"); if (pattern.matcher(words[i]).matches()) { // 匹配成功后的业务逻辑 }
如果只需要筛选存储单位(GB/MB/KB),调整正则的后缀部分即可:
Pattern pattern = Pattern.compile("^\\d+(GB|MB|KB)$"); if (pattern.matcher(words[i]).matches()) { // 匹配成功后的业务逻辑 }
正则规则说明
^匹配字符串开头\\d+匹配1个及以上的阿拉伯数字(GB|MB|KB|AM|PM|ST|ND)匹配括号内任意一个后缀字符串$匹配字符串结尾matches()方法要求整个字符串完全符合正则规则,避免子串匹配导致的误判
内容的提问来源于stack exchange,提问作者Sun
相关产品推荐
相关产品推荐

