Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java是否有一种在StringBuilder上执行多个regex replaceAll操作的有效方法?_Java_Regex_Stringbuilder - Fatal编程技术网

Java是否有一种在StringBuilder上执行多个regex replaceAll操作的有效方法?

Java是否有一种在StringBuilder上执行多个regex replaceAll操作的有效方法?,java,regex,stringbuilder,Java,Regex,Stringbuilder,我想使用StringBuilder之类的工具来保存字符串,然后以一种高效的方式对其执行大量regex replaceAll操作。我想利用StringBuilder的可变大小数组并防止临时字符串分配。也就是说,我希望regex replaceAll操作根据需要改变StringBuilder持有的数组,而不分配临时字符串。我该怎么做 不幸的是,StringBuilder没有内置的方法来实现这一点。它只有一个不带regex的replace()方法,如果不使用Matcher将整个StringBuilde

我想使用StringBuilder之类的工具来保存字符串,然后以一种高效的方式对其执行大量regex replaceAll操作。我想利用StringBuilder的可变大小数组并防止临时字符串分配。也就是说,我希望regex replaceAll操作根据需要改变StringBuilder持有的数组,而不分配临时字符串。我该怎么做


不幸的是,StringBuilder没有内置的方法来实现这一点。它只有一个不带regex的replace()方法,如果不使用Matcher将整个StringBuilder缓冲区有效地替换为新分配的字符串,我想避免这种情况。

regex不会创建额外的字符串。它验证字符串是否与模式匹配(或不匹配)

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

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

在锁的开销和拥有不同字符串对象的开销之间,锁的开销会使维护两个不可变对象的开销减少。简言之,获得锁所花费的cpu周期远远超过没有十几个(甚至可能是一百个)额外字符串所节省的时间


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

您可以在构建字符串之前或构建字符串之后应用正则表达式。作为后续:你为什么要这样做?这是为了避免临时对象还是什么?你能把你想替换的东西放在一个正则表达式中吗?如果你最终在
字符串上使用
replaceAll
而不是
StringBuilder
的话,一种更有效的方法是事先编译
模式
,然后用它来替换使用since
replaceAll
的东西将调用
模式。每次编译
都可以。如果您想替换匹配项,可以使用它,只需分配一个字符数组,并像在C中那样执行。这些正则表达式有多复杂?如果它们是真正的正则表达式,就像在级联、转换和Kleene star中一样,那么在字符数组中滚动您自己的类以进行匹配并不困难,如果您开始使用所有perl功能和UTF编码,则假定使用纯ASCII字符,这会变得更复杂。