Seb*_*ber 5 java regex parsing
我知道我可以匹配数字 Pattern.compile("\\d*");
但它不能处理长的最小/最大值.
对于与异常相关的性能问题,我不想尝试解析长期,除非它真的很长.
if ( LONG_PATTERN.matcher(timestampStr).matches() ) {
long timeStamp = Long.parseLong(timestampStr);
return new Date(timeStamp);
} else {
LOGGER.error("Can't convert " + timestampStr + " to a Date because it is not a timestamp! -> ");
return null;
}
Run Code Online (Sandbox Code Playgroud)
我的意思是我不想要任何try/catch块,并且我不想得到像"564654954654464654654567879865132154778"这样长的异常,这超出了常规Java long的大小.
有人有一个模式来处理原始java类型的这种需求吗?JDK是否提供了自动处理它的东西?Java中是否存在故障安全解析机制?
谢谢
编辑:请假设"坏长字符串"不是例外情况.我不是要求一个基准,我在这里代表一个长期的正则表达式,仅此而已.我知道正则表达式检查所需的额外时间,但至少我的长解析将始终是常量并且永远不会依赖于"坏长字符串"的百分比
我再也找不到链接,但StackOverflow上有一个很好的解析基准,它清楚地表明重用编译正则表达式的sams非常快,比抛出异常快很多,因此只有一小部分异常会使系统变慢与额外的正则表达式检查.
T.J*_*der 10
的最小avlue long是-9,223,372,036,854,775,808,并且最大值为9,223,372,036,854,775,807.所以,最多19位数.所以,\d{1,19}应该让你在那里,也许有一个可选的-,并与^和$匹配字符串的末端.
所以大致:
Pattern LONG_PATTERN = Pattern.compile("^-?\\d{1,19}$");
Run Code Online (Sandbox Code Playgroud)
......或者沿着这些方向的东西,假设你不允许使用逗号(或者已经删除了它们).
正如gexicide在评论中指出的那样,上面允许一小部分(相比之下)无效值范围,例如9,999,999,999,999,999,999.您可以使用正则表达式进行更复杂的处理,或者只是接受以上内容将清除绝大多数无效数字,从而减少解析异常的数量.
| 归档时间: |
|
| 查看次数: |
9485 次 |
| 最近记录: |