java - Java 是否有一种有效的方法在 StringBuilder 上执行多个正则表达式 ReplaceAll 操作?

标签 java regex stringbuilder

我想使用 StringBuilder 之类的东西来保存字符串,然后以有效的方式对其执行大量正则表达式 ReplaceAll 操作。我想利用 StringBuilder 的可变大小数组并防止临时字符串分配。也就是说,我希望正则表达式 ReplaceAll 操作根据需要改变 StringBuilder 保存的数组,而不分配临时字符串。我怎样才能做到这一点?

不幸的是,StringBuilder 没有内置方法来执行此操作。它只有一个没有正则表达式的replace()方法,如果不使用Matcher用新分配的字符串有效地替换整个StringBuilder缓冲区,我看不到一种方法来做到这一点,我想避免这种情况。

最佳答案

正则表达式不会创建额外的字符串。它验证字符串是否匹配(或不匹配)模式。

捕获组返回字符串,但 Java 中的字符串是不可变的,因此您不能让它们由可变存储区域表示,甚至不能由可变存储区域的一部分表示。

此外,正则表达式操作不是单个步骤(即使它看起来在代码中),而是以字符串作为输入的状态机的运行。 Java 是多线程的,如果数据在机器运行时被修改,状态机将无法正常工作。要解决此问题需要锁定缓冲区,这会产生额外的开销。

在锁的开销和拥有不同 String 对象的开销之间,锁的开销会使维护两个不可变对象(immutable对象)所节省的成本为负。简而言之,与没有十几个(甚至可能一百个)附加字符串相比,您在获取锁定上花费的 CPU 周期要多得多。

最后,整个 JVM 包含特定于字符串的优化。如果您想要一个可变字符串,那么这些优化将不起作用,并且会导致 JVM 中更常用的数据类型之一出现奇怪的行为。

关于java - Java 是否有一种有效的方法在 StringBuilder 上执行多个正则表达式 ReplaceAll 操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53677078/

相关文章:

Java:为什么在按钮上绘制背景图像?

java - Android 如何从代码中将一个 LinearLayout 添加到另一个 LinearLayout

javascript - RegEx JS - 如何获取 : and defore/or end of a string 之后的所有内容

c# - P/调用一个传递给 StringBuilder 的函数

java - 无法正确对齐输出

java - 有没有办法在函数内调用 onClick 方法,我应该在参数中传递什么给该方法?

java - 重构依赖过多的服务

html - 如何在第一次出现匹配字符串之前添加 hr 标签?

java - 删除 Java 中的空格和特殊字符

java - 如何替换 arraylist 中包含元素为 stringbuilder 类型的字符串的元素