gpt4 book ai didi

java - 提高基于正则表达式的替换性能

转载 作者:行者123 更新时间:2023-11-29 07:53:46 26 4
gpt4 key购买 nike

大家好,我想问一下内存利用率和一个进程所需的时间。我有以下代码。我想优化我的代码以使其更快。字符串会占用更多内存吗?

public String replaceSingleToWord(String strFileText) {

strFileText = strFileText.replaceAll("\\b(\\d+)[ ]?'[ ]?(\\d+)\"", "$1 feet $2 ");
strFileText = strFileText.replaceAll("\\b(\\d+)[ ]?'[ ]?(\\d+)''", "$1 feet $2 inch");

//for 23o34'
strFileText = strFileText.replaceAll("(\\d+)[ ]?(degree)+[ ]?(\\d+)'", "$1 degree $3 second");

strFileText = strFileText.replaceAll("(\\d+((,|.)\\d+)?)sq", " $1 sq");

strFileText = strFileText.replaceAll("(?i)(sq. Km.)", " sqkm");
strFileText = strFileText.replaceAll("(?i)(sq.[ ]?k.m.)", " sqkm");
strFileText = strFileText.replaceAll("(?i)\\s(lb.)", " pound");
//for pound
strFileText = strFileText.replaceAll("(?i)\\s(am|is|are|was|were)\\s?:", "$1 ");
return strFileText;
}

我认为这将需要更多的内存和时间我只是想降低复杂性。我只是想减少时间和内存来处理我需要做的更改。replaceAll 函数是否有其他选择?我将如何最小化这段代码?以便我变得更快并且内存利用率低?先谢谢你

最佳答案

优化方法:

  • 对每个替换使用Pattern.compile()。创建一个类,创建模式字段,然后只编译一次模式。这样你会节省很多时间,因为每次调用 replaceAll() 时都会进行正则表达式编译,这是一个非常昂贵的操作
  • 使用非贪婪正则表达式。代替 (\\d+) 使用 (\\d+?)
  • 尽可能不使用正则表达式 (lb.->pound)?
  • 将多个具有相同替换的正则表达式合并为一个 - 适用于您的 sqkmfeet 替换
  • 可以尝试将您的 api 基于 StringBuilder;然后使用 addReplacement处理您的文本。

此外,您的许多 replace 中的一个点未转义。点匹配任何字符。使用 \\.

类理念:

class RegexProcessor {
private Pattern feet1rep = Pattern.compile("\\b(\\d+)[ ]?'[ ]?(\\d+)\"");
// ...

public String process(String org) {
String mod = feet1rep.match(org).replaceAll("$1 feet $2 ");
/...
}
}

关于java - 提高基于正则表达式的替换性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19360243/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com