【发布时间】:2012-06-29 21:19:08
【问题描述】:
我知道我可以用Pattern.compile("\\d*");匹配数字
但它不能处理较长的最小值/最大值。
对于与异常相关的性能问题,我不想尝试解析 long,除非它真的很长。
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;
}
我的意思是我不想要任何 try/catch 块,并且我不希望长时间引发异常,例如“564654954654464654654567879865132154778”,它超出了常规 Java long 的大小。
有人有一种模式来处理这种对原始 java 类型的需求吗? JDK是否提供了自动处理它的东西? Java 中是否存在故障安全解析机制?
谢谢
编辑:请假设“坏长字符串”不是例外情况。 我不是要一个基准,我来这里是为了一个代表 long 的正则表达式,仅此而已。 我知道正则表达式检查所需的额外时间,但至少我的长解析将始终保持不变,并且永远不会依赖于“坏长字符串”的百分比
我找不到链接了,但是 StackOverflow 上有一个很好的解析基准,它清楚地表明重用 sams 编译的正则表达式非常快,比抛出异常快很多,因此只有很小的异常阈值会造成系统比使用额外的正则表达式检查要慢。
【问题讨论】:
-
请注意,
"\\d*"也匹配空字符串。 -
可能是your question have already been asked。在我看来,异常会比正则表达式更快。
-
@Sorrow:很好理解前面的问题。重新例外与正则表达式:是什么让你这么认为?抛出异常不是一个快速的过程。编译后,正则表达式很快。
-
如我的回答中所述,这完全取决于例外情况发生的频率。使用模式匹配,您一直都在做额外的工作,除了异常,只有在引发异常时才会完成额外的工作。
-
我在这里同意@gexicide - 这完全取决于捕获异常的频率,因为无论如何都会检查正则表达式。在我看来,结合 T.J. Crowder 回答 (
-?\\d{1,19}) 异常捕获应该是最佳的,那么。