如何在单个字符串上更有效地调用replaceAll两次

时间:2015-03-06 16:39:05

标签: java regex string compilation replaceall

我目前想要在一行中完成所有这些:

String output = Pattern.compile("(\\r|\\n|\\t)").matcher(obj).replaceAll("");
Pattern.compile("[^\\p{Print}]").matcher(output).replaceAll(replacement);

但我无法做到以下几点:

Pattern.compile("(\\r|\\n|\\t)").matcher(obj).replaceAll("").Pattern.compile("[^\\p{Print}]").matcher(output).replaceAll(replacement);

如何才能使第二个正则表达式同时编译?

2 个答案:

答案 0 :(得分:3)

如果“效率”意味着“少打字”,那么方法String.replaceAll(“regex”,“replacement”)可能适合您:

String output = obj.replaceAll("(\\r|\\n|\\t)", "").replaceAll("[^\\p{Print}]", replacement);

你失去了保留模式以供重用的能力,如果你不得不多次使用它,这实际上会更有效。

答案 1 :(得分:2)

由于第一行,output基本上等同于

Pattern.compile("(\\r|\\n|\\t)").matcher(obj).replaceAll("")

因此,您可以使用output替换第二行中的变量Pattern.compile("(\\r|\\n|\\t)").matcher(obj).replaceAll("")。然后该线将成为

Pattern.compile("[^\\p{Print}]").matcher(Pattern.compile("(\\r|\\n|\\t)").matcher(obj).replaceAll("")).replaceAll(replacement);

然而,这并没有真正提高性能,并对可读性产生负面影响。除非你有充分的理由,否则最好只使用前两行。