java - 在 Java 中解析用户定义的格式

标签 java formatting format

我正在使用 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:"
":"
请注意,当连续的占位符丢失/为空时,如何正确消除多个空格。

关于java - 在 Java 中解析用户定义的格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62627487/

相关文章:

JavaFX:FXML 字段可以是私有(private)的吗?

java - 在 Talend 5.5 中使用正则表达式的 jsonpath

java - Java 中的复数求和函数

xml - Jaxb - Marshall - 如何格式化 xml 属性 - 例如,在每个属性后放置一个换行符

java - 我应该将所有类创建为 spring bean

HTML 文本相关格式

PHP mysql格式化文本

Python:打印到一行,打印之间有时间延迟

javascript - 如何将 "2016-02-23T11:31:36.23"转换为JavaScript对象?

PHP : strtotime() returns always 01/01/1970