Java字符串与正则表达式的区别?

时间:2014-10-16 20:45:46

标签: java regex string comparison

我正在努力比较大量的字符串(日志条目),以验证某些系统结果没有改变。我的第一次尝试是直接的,仅使用.equals()比较。如果.equals()失败。

仅当我的系统结果在同一天录制时,此功能才有效。部分数据包括访问时间戳。如果访问日期不同,我不介意,这是我关注的其余有效负载。

作为比较的一小部分字符串的例子:

...3X68 : accessed 14 Oct 2014 : from quo... 
...3X68 : accessed 16 Oct 2014 : from quo...  

字符串有多个"访问dd MMM yyyy"我想忽略的标签,通常在5-10左右,但在某些情况下,数据可以是几百个数百块,有几百个块,每个块都有一个被访问印章的副本。 (是的,删除冗余在列表中。)

我已尝试多次尝试与正则表达式不匹配"访问\ d \ d ... \ d \ d \ d \ d",但由于子字符串可能会出现多次,我和#39; m最终用几个这样的搜索来编写正则表达式测试,但由于它可能看起来可能是一百次或更多次,这很快就不切实际了。

与异常相比,运行此类字符串有哪些更好的方法?直接,还是通过利用图书馆?

1 个答案:

答案 0 :(得分:2)

肯定有很多方法可以解决这个问题。鉴于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);

避免为每个字符串重新编译正则表达式。