java - 用于内联 String.format 调用的正则表达式——用字符串连接替换 %s

标签 java regex refactoring

在我继承的代码库中,有人似乎喜欢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() 等方法调用的参数将不起作用。

您可以通过反复调整表达式来解决这些问题,但是这是否仍然可以节省您的工作量值得怀疑。


如果你还是想尝试一下,我推荐以下方法:

  1. 找到您要处理的 %s 占位符数量最多的模式,并根据所需的参数数量调整搜索和替换模式。
  2. 依次调整每个论点模式,使其与您的论点相匹配。例如,如果您有一个简单方法调用的参数,例如 e.getMessage(),请将适当的 ([^,()]*) 模式替换为 ( [^,()]*\(\))
  3. 继续减少一个 %s 占位符的表达式。
  4. 通过将 (+\s*"")|(""\s+) 替换为空字符串来删除所有连接的空字符串。

关于java - 用于内联 String.format 调用的正则表达式——用字符串连接替换 %s,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48265369/

相关文章:

java - Mediaplayer 停止播放我的声音 - Android studio

java - 如何在 Java 中对用户输入进行四舍五入

javascript - 从包含 javascript 中的 html <BR> 的字符串中解析地址

解析正则表达式时出现 REGEX_TOO_COMPLEX 错误

java - 为什么Eclipse不在 "Generate Delegate Methods"重构中添加@Override注解?

java - 蓝牙启用会扰乱广播接收器

java - 在堆转储上重新启动 java 进程

python - 使用python正则表达式解析文本文件中的相关行组

javascript - 使用 Javascript 异步和等待 google.script.url.getLocation

api - 将微服务内部错误代码组合在一起?