在我继承的代码库中,有人似乎喜欢String.format
,写了如下代码:
String.format("%s: %s", message, e.getMessage())
我想用简单的字符串连接替换 String.format
调用,即
message + ": " + e.getMessage()
这当然可以用正则表达式加速搜索/替换,不是吗?
最佳答案
用正则表达式实现这一目标将具有挑战性。考虑以下搜索/替换模式:
搜索:
String\.format\(\s*"([^%]*)%s([^%]*)%s([^%]*)",\s*([^,()]*),\s*([^,()]*)\)
替换:
"\1" + \4 + "\2" + \5 + "\3"
这些模式(及其变体)有几个问题:
- 它们仅适用于要替换的固定数量的
%s
字符串。 - 如果格式字符串以
%s
开头或结尾,它们会生成空字符串。 - 他们无法处理任意参数。在上面的表格中,只接受变量。包含
e.getMessage()
等方法调用的参数将不起作用。
您可以通过反复调整表达式来解决这些问题,但是这是否仍然可以节省您的工作量值得怀疑。
如果你还是想尝试一下,我推荐以下方法:
- 找到您要处理的
%s
占位符数量最多的模式,并根据所需的参数数量调整搜索和替换模式。 - 依次调整每个论点模式,使其与您的论点相匹配。例如,如果您有一个简单方法调用的参数,例如
e.getMessage()
,请将适当的([^,()]*)
模式替换为( [^,()]*\(\))
- 继续减少一个
%s
占位符的表达式。 - 通过将
(+\s*"")|(""\s+)
替换为空字符串来删除所有连接的空字符串。
关于java - 用于内联 String.format 调用的正则表达式——用字符串连接替换 %s,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48265369/