是否有一个库,它在给定的两个字符串上提供占位符值? [关闭]

Posted

技术标签:

【中文标题】是否有一个库,它在给定的两个字符串上提供占位符值? [关闭]【英文标题】:Is there a library, which, on given two strings, provide placeholder values? [closed] 【发布时间】:2021-06-19 22:36:33 【问题描述】:

给定两个字符串

String command = "Header '1' has a value that ends with '2' (ignore case)";
String input = "Header 'some-value' has a value that ends with '123ws' (ignore case)";

我想获得价值图。

0 -> some-value
1 -> 123ws

我引用了this answer on Java Comparing two strings with placeholder values,为我的使用做了一些微调。

private static Map<Integer, Object> getUserInputMap(String command, String input) 

        System.out.println("\t" + command);
        System.out.println("\t" + input);

        command = command.replace("(", "<");
        command = command.replace(")", ">");
        input = input.replace("(", "<");
        input = input.replace(")", ">");

        Map<Integer, Object> userInputMap = new HashMap<>();

        String patternTemplate = command.replace("0", "(.*)");
        patternTemplate = patternTemplate.replace("1", "(.*)");
        patternTemplate = patternTemplate.replace("2", "(.*)");

        Pattern pattern = Pattern.compile(patternTemplate);
        Matcher matcher = pattern.matcher(input);
        if (matcher.matches()) 
            for (int gi = 1; gi <= matcher.groupCount(); gi++) 
                String uin =  matcher.group(gi);
                uin = uin.replace("<", "(");
                uin = uin.replace(">", ")");
                userInputMap.put(gi - 1, uin);
            

        
        return userInputMap;
    

但是,可能有很多极端情况。我对我的解决方案的担心是我可能会错过一个角落案例,然后是生产错误。

有没有围绕这个写的成熟库?我正在检查 MessageFormat/StrSubstitutor 但我无法获得任何符合我期望的方法。

【问题讨论】:

你能用docs.oracle.com/javase/7/docs/api/java/text/…吗?它为参数提供了一个 Object[] 数组。 String.format() 是否符合您的要求? @FaltFe OP 正在寻找“反向”格式化程序 - 即解析 args。 Java 正则表达式/模式匹配可以做到这一点。 ***.com/questions/4662215/… @JayC667 OP 正在寻找处理极端情况的成熟 解决方案。正则表达式不适合这种情况,因为所说的极端情况可能很难/不可能处理。 【参考方案1】:

从已经格式化的字符串中获取除字符串之外的任何内容并不容易,我不会在这里处理。

您基本上知道占位符的格式,即digits,因此您可以将命令拆分为:command.split("\\0|[1-9][0-9]*\\"(不允许01 等)。

然后遍历结果数组中的元素并在input 中查找完全匹配。执行此操作时,您希望跟踪结束索引以从那里开始搜索,而不是再次从 input 开始。

快速简单的示例(未测试):

String[] parts = command.split("\\0|[1-9][0-9]*\\");
int paramStart = 0;
int index = 0;
for( String part : parts )   
  index = input.indexOf(part, index);
  if( index < 0) 
    //problem: command part hasn't been found - you probably want to end parsing here
   

  //the first part should be found at index 0 so ignore that
  if( index != 0 )
    //parameter value should be between the last part and the current one
   String parameterValue = input.substring(paramStart, index);
   

  //the next parameter starts after the current part
  paramStart= index + part.length();


//there seems to be a last placeholder at the end of the command
if(paramStart < input.length() - 1) 
  //get the substring here

这应该能够处理大多数情况,除了参数看起来像您的命令部分或占位符彼此相邻且无法区分的情况。以"1 - 2" 和参数"A - B""C - D" 为例,结果将是"A - B - C - D",在这种情况下,如果没有更多信息(您没有只有占位符)。

【讨论】:

以上是关于是否有一个库,它在给定的两个字符串上提供占位符值? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如果 Spring Boot 的属性文件中未提供占位符值,如何跳过?

是否可以将AdaptiveTextBlock占位符值作为参数列表发送到web api调用

嵌套python字典中的字符串替换/格式化占位符值

是否可以从外部 Maven 依赖项在 Spring Java 项目中导入占位符值 (@Value)?

用点击的 span 标签的 innerHTML 替换占位符值

文本框的占位符值不会更改为原始值?