我正在比较大量字符串(日志条目)以验证某些系统结果是否未更改。我的第一次尝试足够直接,只是使用 .equals() 比较。如果 .equals() 失败。
只有当我的系统结果在同一天记录时,此功能才有效。部分数据包括访问的时间戳。我不介意访问日期是否不同,我关心的是其余的有效负载。
作为我正在比较的一小部分字符串的示例:
...3X68 : accessed 14 Oct 2014 : from quo...
...3X68 : accessed 16 Oct 2014 : from quo...
这些字符串有多种我想忽略的“accessed dd MMM yyyy”标签,通常约为 5-10 个,但在某些情况下,数据可能有数百千字节,有数百个 block ,每个 block 都有一个副本已访问的邮票。 (是的,删除冗余就在列表中。)
我已经尝试了几次与正则表达式“accessed\d\d ...\d\d\d\d”不匹配的尝试,但由于子字符串可能会出现多次,所以我最终编写了正则表达式对多次此类搜索进行测试,但由于它可能会出现一百次或更多次,因此这很快就不切实际。
有哪些更好的方法来运行这种字符串与异常的比较?直接还是通过利用库?
最佳答案
确实有很多方法可以解决这个问题。鉴于除了时间戳问题之外,String.equals()
比较可以满足您的目的,相对简单的方法是从输入和比较数据中删除时间戳,并使用 String。 equals()
来比较您关心的部分(即剩下的部分)。您可以使用正则表达式来进行剥离:
Pattern tsPattern = Pattern.compile("accessed \d\d ... \d\d\d\d");
Matcher m = tsPattern.matcher(input);
String stripped = m.replaceAll("");
您也可以使用 String.replaceAll()
来完成此操作,但如果您要进行大量替换,那么使用 Matcher
会更便宜,因为您可以做
m.reset(nextInput);
避免为每个字符串重新编译正则表达式。
关于Java字符串比较与正则表达式的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26413592/