Java - 使用模板从字符串中提取键值对

标签 java string-matching string-substitution

所以在 org.apache.commons.lang3.text 中有一个名为 StrSubstitutor 的类,它可以接受这样的映射:

Map<String, String> params = new HashMap<String, String>();
params.put("name","Vivek");
params.put("id","900");
params.put("somethingelse","blah");

和这样的模板字符串:

    <data>
       <id>${id}</id>
       <name>${name}</name>
       <something>${somethingelse}</something>
    </data>

生成这样的输出字符串:

   <data>
       <id>900</id>
       <name>Vivek</name>
       <something>blah</something>
   </data>

我想要的恰恰相反。有没有一种方法可以将输出字符串和模板以模板变量作为键并以字符串中的相应值作为值来填充 map ?

PS - 我将使用的字符串不一定总是 XML。这只是一个例子。

编辑:我认为有些人感到困惑,因为变量名称和标签名称相同。标签只是说明性的,与问题无关。我关心的是 ${} 中的变量。我添加了另一个标签来说明我的意思。

最佳答案

这是另一种选择:

import java.util.HashMap;
import java.util.Map;

public class Test{

    public static void main(String[] args){

        //simulate template. Assuming no more than on param in line
        String[] template = new String[]{
                                    "<data>",
                                    "<id>${id}</id>",
                                    "<name>${name}</name>",
                                    "<something>${somethingelse}</something>",
                                    "</data>"
                                    };

        String[] output = new String[]{
                                    "<data>",
                                    "<id>900</id>",
                                    "<name>Vivek</name>",
                                    "<somethingelse>blah</somethingelse>",
                                    "</data>"
                                    };

        Map<String, String> params = getParams(template);

        getValues(params, output);

        for(String key : params.keySet()) {
            System.out.println(key +" : " + params.get(key));
        }
    }

    private static Map<String, String> getParams(String[] template) {

        Map<String, String> params = new HashMap<String, String>();

        for (String line : template) {

            //get location of 3 chars ${}
            int index$ = line.indexOf("$");
            int indexLeftB = line.indexOf("{");
            int indexRightB = line.indexOf("}");

            //make sure all ${} are present
            if((index$ <0) || (indexLeftB <0) || (indexRightB <0) ) {
                continue;
            }

            //make sure they are in the right order
            if( ((indexLeftB - index$) !=1) || (indexRightB < indexLeftB)) {
                continue;
            }

            //get param
            String param = getParamFromLine(line, indexLeftB+1 , indexRightB);

            if(param != null) {

                params.put(param,null);
            }
        }

        return params;
    }

    private static void getValues(Map<String, String> params, String[] output) {

        //iterate over map
        for(String param : params.keySet()) {

            String tag = "<"+param+">"; //like <name>
            String closeTag = "</"+param+">"; //like <name>

            //iterate over output
            for(String line : output) {

                line = line.trim(); //remove all whitespace
                //look for first occurrence of patternToSearch
                int index1 = line.indexOf(tag, 0);
                int index2 = line.indexOf(closeTag, index1);

                //make sure there are 2 occurrences in
                if((index1 < 0) || (index2 < 0)) {
                    continue;
                }

                String value = getParamFromLine(line, index1+ tag.length(), index2);
                if(value != null) {

                    params.put(param, value);
                }
            }
        }
    }

    private static String getParamFromLine(String line, int indexLeftB, int indexRightB) {

        String param = line.substring(indexLeftB, indexRightB);

        return (param.trim().length() == 0) ? null : param.trim();
    }
}

关于Java - 使用模板从字符串中提取键值对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39813198/

相关文章:

java - JPA 中的级联设置和 hibernate 中的外键违规

java - 如何使用 mouselistener 访问一个组件而不是另一个组件

c# - 使用通配符过滤字符串列表

r - agrep:只返回最佳匹配

java - 在 Java 中将文本文件表示为单个单元,并匹配文本中的字符串

javascript - 将字符串外部化到单独文件时的字符串替换

java - 读取与jar文件相同目录中的配置文件

java - 自定义 ListView 滚动 - 仅 Imageviews

perl - 在perl中使用替换运算符跳过字符串中的特定位置

algorithm - 多字符替换密码算法