代码之家  ›  专栏  ›  技术社区  ›  Lluis Martinez

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

  •  1
  • Lluis Martinez  · 技术社区  · 14 年前

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

    …αPARAM1α…αPARAM2α………

    我想用值替换参数占位符。

    当前算法如下:

        //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()));
        }
    

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

    2 回复  |  直到 14 年前
        1
  •  3
  •   Chad Okere    14 年前

    如果这是一个普通的SQL查询,那么您可能希望使用 PreparedStatements

    除此之外,我还缺什么吗?为什么不直接使用string.replace()?您的代码可能如下所示:

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

    假设您有一个名为“values”的映射,其中参数之间的字符串映射形式为“paramn”

        2
  •  0
  •   Kylar    14 年前

    如果您需要更通用的,这将找到并返回整个参数,包括的:

    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);
            }
    
    
        }
    
    }