Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.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 正则表达式到内联String.format调用–将%s替换为字符串连接_Java_Regex_Refactoring - Fatal编程技术网

Java 正则表达式到内联String.format调用–将%s替换为字符串连接

Java 正则表达式到内联String.format调用–将%s替换为字符串连接,java,regex,refactoring,Java,Regex,Refactoring,在我继承的代码库中,似乎有人喜欢String.format并编写了如下代码: String.format("%s: %s", message, e.getMessage()) 我想用一个简单的字符串连接来替换String.format调用,即 message + ": " + e.getMessage() 这当然可以用正则表达式加快搜索/替换速度,不是吗?用正则表达式实现这一点很有挑战性。考虑下面的搜索/替换模式: 搜索: 字符串\.format\\s*[^%]*%s[^%]*%s[^%]*

在我继承的代码库中,似乎有人喜欢String.format并编写了如下代码:

String.format("%s: %s", message, e.getMessage())
我想用一个简单的字符串连接来替换String.format调用,即

message + ": " + e.getMessage()

这当然可以用正则表达式加快搜索/替换速度,不是吗?

用正则表达式实现这一点很有挑战性。考虑下面的搜索/替换模式:

搜索:

字符串\.format\\s*[^%]*%s[^%]*%s[^%]*,\s*[^,]*,\s*[^,]*\ 替换:

\1 + \4 + \2 + \5 + \3 这些模式及其变体有几个问题:

它们仅适用于要替换的固定数量的%s字符串。 如果格式字符串以%s开始或结束,它们将生成空字符串。 他们不能处理任意的论点。在上面的表格中,只接受变量。包含e.getMessage等方法调用的参数将不起作用。 您可以通过反复修改表达式来解决这些问题,但这是否仍能节省您的工作量还是个问题

如果您仍想尝试,我建议您采用以下方法:

查找要处理的具有最多%s占位符的模式,并根据所需的参数数调整搜索和替换模式。 反过来,调整每个参数模式,使其与您的参数匹配。例如,如果有带有简单方法调用(如e.getMessage)的参数,请将相应的[^,]*模式替换为[^,]*\\ 继续使用少一个%s占位符的表达式。 通过不替换+\s*|\s+删除所有连接的空字符串。
用正则表达式实现这一点将是一个挑战。考虑下面的搜索/替换模式:

搜索:

字符串\.format\\s*[^%]*%s[^%]*%s[^%]*,\s*[^,]*,\s*[^,]*\ 替换:

\1 + \4 + \2 + \5 + \3 这些模式及其变体有几个问题:

它们仅适用于要替换的固定数量的%s字符串。 如果格式字符串以%s开始或结束,它们将生成空字符串。 他们不能处理任意的论点。在上面的表格中,只接受变量。包含e.getMessage等方法调用的参数将不起作用。 您可以通过反复修改表达式来解决这些问题,但这是否仍能节省您的工作量还是个问题

如果您仍想尝试,我建议您采用以下方法:

查找要处理的具有最多%s占位符的模式,并根据所需的参数数调整搜索和替换模式。 反过来,调整每个参数模式,使其与您的参数匹配。例如,如果有带有简单方法调用(如e.getMessage)的参数,请将相应的[^,]*模式替换为[^,]*\\ 继续使用少一个%s占位符的表达式。 通过不替换+\s*|\s+删除所有连接的空字符串。
出于性能原因,我不建议这样做


使用串联时,字符串池将很快填满,因为每次进行串联时,都会创建一个新的字符串副本

出于性能原因,我不建议这样做


使用串联时,字符串池将很快填满,因为每次进行串联时,都会创建一个新的字符串副本

如果e是一个例外,那么代码无论如何都是无用的。没有stacktrace记录异常是垃圾。还不清楚您为什么要更换它?你可以更好地利用你的时间。你是对的,这个例子已经无法修复了。但我还有其他例子,替换String.format可以提高合理代码的可读性。易读性是非常重要的。。。但是,我们不要就此展开激烈的战争:可读性也有点基于观点,因此,如果您在整个代码库上运行正则表达式只是为了让它在您看来更可读,那么它对时间的使用仍然是非常可疑的。如果e是一个例外,那么该代码无论如何都是无用的。没有stacktrace记录异常是垃圾。还不清楚您为什么要更换它?你可以更好地利用你的时间。你是对的,这个例子已经无法修复了。但我还有其他例子,替换String.format可以提高合理代码的可读性。易读性是非常重要的。。。但我们不要就此展开激烈的战争:可读性也有点基于观点,因此,如果您在整个代码库上运行正则表达式只是为了让它在您看来更具可读性,那么它对时间的使用仍然非常可疑。不,这不是性能问题。编译器优化连接以使用StringBuilder或任何最快的工具。字符串连接使用InvokedDynamic,因为Java 9:不,这不是性能问题。编译器优化连接以使用StringBuilder或任何最快的工具。字符串连接使用invokedynami c自Java 9以来: