java - 在 Java 中解析用户定义的格式
问题描述
我正在使用 Java 开发格式解析器,但遇到了一些麻烦。该格式已存储,以便用户可以根据自己的喜好进行更改。
format: '[prefix] [name] [suffix]: [msg]'
将我的值放在我String.replace()
在 Java 中使用的格式中。
format = getFormatTemplate(); // '[prefix] [name] [suffix]: [msg]'
format = format.replace("[prefix]", prefix); // prefix = "Hello";
format = format.replace("[name]", name); // name = "username";
format = format.replace("[suffix]", suffix); // suffix = "World";
format = format.replace("[msg]", msg); // msg = "Test message";
这将产生Hello username World: Test message
我期望的输出。但是当字符串的某些部分为空时,那里会有一个空格。
例如,当为suffix
空时,输出将Hello username : Test message
注意名称和之间的空格:
我怎样才能摆脱它,以便某些部分可以为空而不破坏用户定义的格式?
有没有更好的方法来解析和应用格式?
解决方案
以下方法将完成这项工作:
static String replace(String text, Map<String, String> values) {
StringBuilder result = new StringBuilder();
int textIdx = 0;
for (int startIdx; (startIdx = text.indexOf('[', textIdx)) != -1; ) {
int endIdx = text.indexOf(']', startIdx + 1);
if (endIdx == -1)
break;
result.append(text.substring(textIdx, startIdx));
textIdx = endIdx + 1;
String value = values.get(text.substring(startIdx + 1, endIdx));
if (value != null && ! value.isEmpty()) {
result.append(value); // Replace placeholder with non-empty value
} else if (result.length() != 0 && result.charAt(result.length() - 1) == ' ') {
result.setLength(result.length() - 1); // Remove space before placeholder
} else if (textIdx < text.length() && text.charAt(textIdx) == ' ') {
textIdx++; // Skip space after placeholder
}
}
result.append(text.substring(textIdx));
return result.toString();
}
测试
public static void main(String[] args) {
test("[prefix] [name] [suffix]: [msg]",
Map.of("prefix", "Hello",
"name", "username",
"suffix", "World",
"msg", "Test message"));
test("[prefix] [name] [suffix]: [msg]",
Map.of("name", "username",
"suffix", "World",
"msg", "Test message"));
test("[prefix] [name] [suffix]: [msg]",
Map.of("prefix", "Hello",
"suffix", "World",
"msg", "Test message"));
test("[prefix] [name] [suffix]: [msg]",
Map.of("prefix", "Hello",
"name", "username",
"msg", "Test message"));
test("[prefix] [name] [suffix]: [msg]",
Map.of("prefix", "Hello",
"name", "username",
"suffix", "World"));
test("[prefix] [name] [suffix]: [msg]",
Map.of());
}
static void test(String text, Map<String, String> values) {
System.out.println('"' + replace(text, values) + '"');
}
输出
"Hello username World: Test message"
"username World: Test message"
"Hello World: Test message"
"Hello username: Test message"
"Hello username World:"
":"
请注意,当连续的占位符丢失/为空时,如何正确消除多个空格。
推荐阅读
- botframework - 如何在节点机器人 v4 中实现确认提示默认语言环境
- json - 为什么我无法检索我的数据?(Flutter-Rest API)
- unity3d - 将 Unity RenderTexture 流式传输到 Gstreamer
- php - 如何使用 laravel Facade 模拟传递引用参数?
- spring-boot - Springboot Application 启动失败,OutOfMemoryError: Java heap space (Unable to create entityManagerFactory Bean)
- google-cloud-platform - 如何防止 Google Cloud Function 实例宕机
- flutter - 嵌套行/列中的颤振扩展图表
- visual-studio - MDX openingperiod, closingperiod 和 sum(measure) 返回相同的值
- c - C预处理器:从给定的枚举值声明结构数据
- php - 填写一个字段后如何自动填写其他表单字段?