java - Java 中的正则表达式性能——复杂的少还是简单的多好?

标签 java regex performance

我正在使用 Java 中的正则表达式进行一些相当广泛的字符串操作。目前,我有许多看起来像这样的代码块:

Matcher m = Pattern.compile("some pattern").matcher(text);
StringBuilder b = new StringBuilder();
int prevMatchIx = 0;
while (m.find()) {
 b.append(text.substring(prevMatchIx, m.start()));
 String matchingText = m.group(); //sometimes group(n)
 //manipulate the matching text
 b.append(matchingText);
 prevMatchIx = m.end();
}
text = b.toString()+text.substring(prevMatchIx);

我的问题是这两种选择中哪一种更有效(主要是时间,但在某种程度上是空间):

1) 保留上面的许多现有 block (假设没有更好的方法来处理这些 block ——我不能使用简单的 replaceAll() 因为必须对组进行操作).

2) 将 block 合并为一个大块。使用 “some pattern”,它是使用 |/alternation 运算符组合所有旧 block 的模式。然后,在循环中使用 if/else if 来处理每个匹配模式。

感谢您的帮助!

最佳答案

如果进行替换的顺序很重要,则在使用技巧 #1 时必须小心。请允许我举个例子:如果我想格式化一个字符串使其适合包含在 XML 中,我必须首先替换所有 &&amp;然后然后进行其他替换(例如 <&lt; )。使用技巧 #2,您不必担心这一点,因为您是一次性完成所有替换。

就性能而言,我认为 #2 会更快,因为您将执行更少的字符串连接。与往常一样,您可以实现这两种技术并记录它们的速度和内存消耗,以便确定。 :)

关于java - Java 中的正则表达式性能——复杂的少还是简单的多好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3313972/

相关文章:

java - 如何检测和删除 URL 中的一句话?

java - 如何检查字符串是否包含字符序列和反斜杠 "\"?

c# - 背靠背 for 循环中的 int、short、byte 性能

java - 以所需格式列出 Maven 项目的依赖项

java - 将 int 转换为 string 并返回

java - 我可以从方法中捕获抛出异常吗?

javascript - 正则表达式 JavaScript : Match consecutive single line comments

java - 使用嵌套Map对数据进行排序和分组是否效率低下?

php - 我应该如何修改站点地图?

Java simple-json 解析器弄乱了变量