如何编写可匹配符合JLS 17规范的所有Java整数字面量的正则表达式
匹配Java整数字面量的正则方案
完全存在符合要求的正则表达式,可以覆盖JLS 17定义的所有合法Java整数字面量,且适配Matcher.find()的逐次扫描逻辑,不需要额外处理就能自动跳过前后的无关字符、分隔符。
最终正则表达式
String regex = "\\b(?:0[xX](?:_?[0-9a-fA-F])+|0[bB](?:_?[01])+|0(?:_?[0-7])+|[1-9](?:_?[0-9])*|0)(?:[lL])?\\b";
规则说明
这个正则完全对齐JLS 17的整数字面量定义,覆盖四类合法格式,同时严格过滤非法写法:
- 支持十进制、八进制、十六进制、二进制四种字面量格式
- 允许数字之间插入任意数量的下划线做分隔,不会匹配开头/结尾/前缀后紧跟下划线的非法写法
- 支持可选的
l/L后缀标记long类型 - 自动忽略前缀减号,和你要求的仅匹配数字部分的规则一致
匹配效果验证
你给出的示例全部可以正常匹配:
-1:仅匹配到1,减号不会被纳入结果0x00_00_00_0F:完整匹配整串0b0000_1111:完整匹配整串017:完整匹配整串
其他合法字面量比如123_456、0xFFL、0b1010l、0123_456也都可以正常识别。
使用方式
直接用该正则创建Pattern对象,循环调用Matcher.find()即可逐个提取字符串中所有符合要求的整数字面量。
内容的提问来源于stack exchange,提问作者Maarten Bodewes
相关产品推荐
相关产品推荐

