Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.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 replaceAll()字符串方法的多次使用_Java_Regex_String_Replaceall - Fatal编程技术网

Java replaceAll()字符串方法的多次使用

Java replaceAll()字符串方法的多次使用,java,regex,string,replaceall,Java,Regex,String,Replaceall,我正在做一些文本预处理,并且至少使用了10次replaceAll()方法。恐怕这已经开始变得效率低下了 我的代码如下: text = text.replaceAll(regex1, "rStr"); text = text.replaceAll(regex2, "rStr2"); . . . text = text.replaceAll(regexn, "rStrn"); 我想我应该使用StringBuilder,以避免一直生成新字符串,但我没有注意到有多大的区别 StringBuilder

我正在做一些文本预处理,并且至少使用了10次replaceAll()方法。恐怕这已经开始变得效率低下了

我的代码如下:

text = text.replaceAll(regex1, "rStr");
text = text.replaceAll(regex2, "rStr2");
.
.
.
text = text.replaceAll(regexn, "rStrn");
我想我应该使用StringBuilder,以避免一直生成新字符串,但我没有注意到有多大的区别

StringBuilder sb = new StringBuilder();
sb.append(text.replaceAll(regex1, "rStr"));
sb.replace(0, sb.length(), sb.toString().replaceAll(regex2, "rStr2"));
.
.
.
sb.replace(0, sb.length(), sb.toString().replaceAll(regexn, "rStrn"));

有没有办法让这段代码更高效?

尽量不要使用正则表达式。在java中,这主要是:

  • 替换
  • 分裂
  • 模式和匹配器类

如果您可以使用substring方法或indexOf方法,请这样做

尽量不要使用正则表达式。在java中,这主要是:

  • 替换
  • 分裂
  • 模式和匹配器类

如果您可以使用substring方法或indexOf方法,请这样做

根据您的模式,您可以通过预编译它们来获得适当的改进
replaceAll
必须执行类似于Pattern.compile(patternStr).matcher(this).replaceAll(replacement)的操作。它不会缓存
模式
,因此如果只编译一次,就会看到改进,只要代码被多次调用


如果可以,请使用
String.replace()
而不是
String.replaceAll()
,但听起来您需要该模式。

根据您的模式,您可以通过预编译这些模式获得相当好的改进
replaceAll
必须执行类似于Pattern.compile(patternStr).matcher(this).replaceAll(replacement)的操作。它不会缓存
模式
,因此如果只编译一次,就会看到改进,只要代码被多次调用



如果可以,请使用
String.replace()
而不是
String.replaceAll()
,但这听起来有点像您需要该模式。

如果您用您正在使用的语言标记问题,可能会有所帮助-Java不是吗?如果您只调用了10次replaceAll()方法,这是一个非常小的效率问题,这就是为什么你没有注意到太多的差异。你能告诉我们更多关于你为什么要做这么多的子字符串替换吗?当然,我需要清除文本中的多个和不同的不需要的功能,如表情符号、LOL、数字等等。所以,既然没有一种模式可以抓住所有这些案例,我想我需要这样做。如果你只需要更换一个,你就可以通过更换来加快速度。但实际上,您可能需要的是Aho Corasick(这很有趣,有点像一个简化的正则表达式)。如果您用您正在使用的语言标记问题,可能会有所帮助-Java不是吗?如果您只调用replaceAll()方法~10次,这是一个非常小的效率问题,这就是为什么你没有注意到太多的差异。你能告诉我们更多关于你为什么要做这么多的子字符串替换吗?当然,我需要清除文本中的多个和不同的不需要的功能,如表情符号、LOL、数字等等。所以,既然没有一种模式可以抓住所有这些案例,我想我需要这样做。如果你只需要更换一个,你就可以通过更换来加快速度。但实际上,你可能想在这里看到的是Aho Corasick(这很有趣,有点像是一个哑巴的正则表达式)。我讨厌这个建议。预编译模式比您想象的要快,但更重要的是,如果它们可读,您的代码将比子字符串hell更干净、更不脆弱。split()不使用正则表达式来表示仅为字符串文字的正则表达式。这是一个通用用例实现中的优化。Yes split使用正则表达式我一直使用[\n\r]+。正则表达式在不应该的时候被过度使用了。我建议至少在replaceAll之前进行contains调用,这样在某些情况下可以避免使用正则表达式。单独这样做会大大加快我的代码速度;split不为类似split(“foo”)的东西使用模式。它适用于“\\s+”。我倾向于发现它们没有被充分利用,人们求助于手工解析,因为他们要么不知道正则表达式,要么过早地进行了优化。现实世界中的性能问题几乎总是围绕磁盘IO、网络IO或在大型数据集上频繁运行的算法。但是如果你没有预编译你的模式,我可以理解为什么你会认为它们很慢。我明白你的意思。但就我在这篇文章中的观点而言,replaceAll创造了恐怖故事。我反对这个建议。我讨厌这个建议。预编译模式比您想象的要快,但更重要的是,如果它们可读,您的代码将比子字符串hell更干净、更不脆弱。split()不使用正则表达式来表示仅为字符串文字的正则表达式。这是一个通用用例实现中的优化。Yes split使用正则表达式我一直使用[\n\r]+。正则表达式在不应该的时候被过度使用了。我建议至少在replaceAll之前进行contains调用,这样在某些情况下可以避免使用正则表达式。单独这样做会大大加快我的代码速度;split不为类似split(“foo”)的东西使用模式。它适用于“\\s+”。我倾向于发现它们没有被充分利用,人们求助于手工解析,因为他们要么不知道正则表达式,要么过早地进行了优化。现实世界中的性能问题几乎总是围绕磁盘IO、网络IO或在大型数据集上频繁运行的算法。但是如果你没有预编译你的模式,我可以理解为什么你会认为它们很慢。我明白你的意思。但就我在这篇文章中的观点而言,replaceAll创造了恐怖故事。我建议不要。是的,我确实需要这个图案。谢谢,我会试试看,稍后再告诉你。是的,我确实需要这个图案。谢谢,我试试看,让你知道