Алгоритм поиска и замены разделенных параметров - PullRequest
1 голос
/ 20 января 2010

У меня есть строка, которая содержит несколько параметров, разделенных #, например:

.... # param1 # ... # param2 # ... # paramN # ...

И я хочу заменить заполнители параметров на значения.

Текущий алгоритм выглядит так:

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

Я ищу простейшее решение с использованием регулярных выражений или другого открытого API. Входными параметрами будут исходная строка, разделитель и карта значений. Выходным параметром будет исходная строка с заменой всех параметров.

Ответы [ 2 ]

3 голосов
/ 20 января 2010

Если это обычный запрос SQL, возможно, вы захотите использовать PreparedStatements

Кроме того, я что-то упустил? Почему бы просто не использовать String.replace ()? Ваш код может выглядеть так:

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

Предполагается, что у вас есть карта под названием "values" со строковыми отображениями между параметрами в форме "#paramN #"

0 голосов
/ 20 января 2010

Если вам нужно более общее значение, он найдет и вернет весь параметр, включая #:

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


    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...