Java是否有一种在StringBuilder上执行多个regex replaceAll操作的有效方法?
我想使用StringBuilder之类的工具来保存字符串,然后以一种高效的方式对其执行大量regex replaceAll操作。我想利用StringBuilder的可变大小数组并防止临时字符串分配。也就是说,我希望regex replaceAll操作根据需要改变StringBuilder持有的数组,而不分配临时字符串。我该怎么做Java是否有一种在StringBuilder上执行多个regex replaceAll操作的有效方法?,java,regex,stringbuilder,Java,Regex,Stringbuilder,我想使用StringBuilder之类的工具来保存字符串,然后以一种高效的方式对其执行大量regex replaceAll操作。我想利用StringBuilder的可变大小数组并防止临时字符串分配。也就是说,我希望regex replaceAll操作根据需要改变StringBuilder持有的数组,而不分配临时字符串。我该怎么做 不幸的是,StringBuilder没有内置的方法来实现这一点。它只有一个不带regex的replace()方法,如果不使用Matcher将整个StringBuilde
不幸的是,StringBuilder没有内置的方法来实现这一点。它只有一个不带regex的replace()方法,如果不使用Matcher将整个StringBuilder缓冲区有效地替换为新分配的字符串,我想避免这种情况。regex不会创建额外的字符串。它验证字符串是否与模式匹配(或不匹配) 捕获组返回字符串,但Java中的字符串是不可变的,因此不能让它们由可变存储区域表示,甚至不能由可变存储区域的一部分表示 此外,Regex操作不是单个步骤(即使它似乎在代码中),而是以字符串作为输入的状态机的运行。Java是多线程的,如果在机器运行时修改数据,状态机将无法正常工作。要解决这个问题,需要锁定缓冲区,这将导致额外的开销 在锁的开销和拥有不同字符串对象的开销之间,锁的开销会使维护两个不可变对象的开销减少。简言之,获得锁所花费的cpu周期远远超过没有十几个(甚至可能是一百个)额外字符串所节省的时间
最后,整个JVM包含特定于字符串的优化。如果您想要一个可变字符串,那么这些优化将不起作用,并且会在JVM中一种更常用的数据类型中导致奇怪的行为。您可以在构建字符串之前或构建字符串之后应用正则表达式。作为后续:你为什么要这样做?这是为了避免临时对象还是什么?你能把你想替换的东西放在一个正则表达式中吗?如果你最终在
字符串上使用replaceAll
而不是StringBuilder
的话,一种更有效的方法是事先编译模式
,然后用它来替换使用sincereplaceAll
的东西将调用模式。每次编译都可以。如果您想替换匹配项,可以使用它,只需分配一个字符数组,并像在C中那样执行。这些正则表达式有多复杂?如果它们是真正的正则表达式,就像在级联、转换和Kleene star中一样,那么在字符数组中滚动您自己的类以进行匹配并不困难,如果您开始使用所有perl功能和UTF编码,则假定使用纯ASCII字符,这会变得更复杂。