Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 搜索和替换分隔参数的算法_Java_Regex - Fatal编程技术网

Java 搜索和替换分隔参数的算法

Java 搜索和替换分隔参数的算法,java,regex,Java,Regex,我有一个字符串,其中包含由分隔的多个参数,如下所示: 。。。。参数1。。。参数2。。。参数 我想用值替换参数占位符 当前算法如下所示: //retrieve place holder into this SQL select Pattern p = Pattern.compile(DIMConstants.FILE_LINE_ESCAPE_INDICATOR); Matcher m = p.matcher(sqlToExec); // get a matcher obje

我有一个字符串,其中包含由分隔的多个参数,如下所示:

。。。。参数1。。。参数2。。。参数

我想用值替换参数占位符

当前算法如下所示:

    //retrieve place holder into this SQL select
    Pattern p = Pattern.compile(DIMConstants.FILE_LINE_ESCAPE_INDICATOR);
    Matcher m = p.matcher(sqlToExec); // get a matcher object
    int count = 0;
    int start = 0;
    int end = 0;

    StringBuilder params = new StringBuilder();
    while (m.find()) {
        count++;

        if (count % 2 == 0) {

            // Second parameter delimiter

            String patternId = sqlToExec.substring(start, m.end());

            //Clean value (#value#->value)
            String columnName = patternId.substring(1, patternId.length() - 1);

            //Look for this column into preLoad row ResultSet and retrieve its value
            String preLoadTableValue = DIMFormatUtil.convertToString(sourceRow.get(columnName));

            if (!StringUtils.isEmpty(preLoadTableValue)) {
                aSQL.append(loadGemaDao.escapeChars(preLoadTableValue).trim());
            } else {
                aSQL.append(DIMConstants.COL_VALUE_NULL);
            }
            params.append(" " + columnName + "=" + preLoadTableValue + " ");

            end = m.end();

        } else {
            // First parameter delimiter
            start = m.start();
            aSQL.append(sqlToExec.substring(end, m.start()));
        }
    }

    if (end < sqlToExec.length()) {
        aSQL.append(sqlToExec.substring(end, sqlToExec.length()));
    }
for(int i = 0; i < n; i++){
   String paramName = "#param" + i + "#"
   sqlToExec = sqlToExec.replace(paramName,values.get(paramName));
}

我正在寻找一个最简单的解决方案,使用regexp或其他公共API。输入参数将是源字符串、分隔符和值映射。输出参数将是替换了所有参数的源字符串。

如果这是用于普通SQL查询,您可能需要考虑使用

除此之外,我还遗漏了什么吗?为什么不直接使用String.replace?您的代码可能如下所示:

    //retrieve place holder into this SQL select
    Pattern p = Pattern.compile(DIMConstants.FILE_LINE_ESCAPE_INDICATOR);
    Matcher m = p.matcher(sqlToExec); // get a matcher object
    int count = 0;
    int start = 0;
    int end = 0;

    StringBuilder params = new StringBuilder();
    while (m.find()) {
        count++;

        if (count % 2 == 0) {

            // Second parameter delimiter

            String patternId = sqlToExec.substring(start, m.end());

            //Clean value (#value#->value)
            String columnName = patternId.substring(1, patternId.length() - 1);

            //Look for this column into preLoad row ResultSet and retrieve its value
            String preLoadTableValue = DIMFormatUtil.convertToString(sourceRow.get(columnName));

            if (!StringUtils.isEmpty(preLoadTableValue)) {
                aSQL.append(loadGemaDao.escapeChars(preLoadTableValue).trim());
            } else {
                aSQL.append(DIMConstants.COL_VALUE_NULL);
            }
            params.append(" " + columnName + "=" + preLoadTableValue + " ");

            end = m.end();

        } else {
            // First parameter delimiter
            start = m.start();
            aSQL.append(sqlToExec.substring(end, m.start()));
        }
    }

    if (end < sqlToExec.length()) {
        aSQL.append(sqlToExec.substring(end, sqlToExec.length()));
    }
for(int i = 0; i < n; i++){
   String paramName = "#param" + i + "#"
   sqlToExec = sqlToExec.replace(paramName,values.get(paramName));
}

假设您有一个名为values的映射,参数之间的字符串映射形式为paramN

,如果您需要更通用的映射,这将查找并返回整个param,包括:

public class ParamFinder {

    public static void main(String[] args) {
        String foo = "#Field1# #Field2# #Field3#";

        Pattern p = Pattern.compile("#.+?#");
        Matcher m = p.matcher(foo);
        List matchesFound = new ArrayList();
        int ndx = 0;
        while(m.find(ndx)){
            matchesFound.add(m.group());
            ndx = m.end();
        }

        for(Object o : matchesFound){
            System.out.println(o);
        }


    }

}

参数之间是椭圆还是背靠背?param1…param2…param3或param1param2param3?分隔符从不背靠背。参数的名称是免费的,但是的,我可以读取映射中的所有键并替换。查询是从XML检索的,使用PreparedStatements意味着将参数的格式更改为use?。