Поиск подстроки между специальным символом в строке - PullRequest
1 голос
/ 16 декабря 2011

У меня есть строка типа

(&(objectclass=${abc})(uid=${xyz}))

Как мне найти $ {abc} и $ {xyz} и заменить на другие строки. Может быть любого числа таких подстрок, т.е. $ {abc} в основной строке. Я думал о string.indexOf(, но это может быть грязно. Любой лучший подход?

$ {abc} будет заменен другой строкой abc. Я получу их от некоторых других параметров.

Ответы [ 4 ]

2 голосов
/ 16 декабря 2011

Вам необходимо экранировать специальные символы ($, {, }).Попробуйте это:

str.replaceAll("\\$\\{abc\\}","abc");

Это может быть странно, но может помочь вам:

str = str.substring(str.indexOf("${")+2, str.indexOf("}"))

Это будет работать для всех (любого количества) строк между ${ и}.

1 голос
/ 16 декабря 2011

Я бы неоднократно использовал String.indexOf(String sep, int start) в цикле для копирования текста и значений в StringBuilder.


Что-то вроде

public static void main(String... args) throws IOException {
    Map<String, String> map = new LinkedHashMap<>();
    map.put("abc", "ABC");
    map.put("xyz", "XYZ");
    printSubstitue("nothing to change", map);
    printSubstitue("(&(objectclass=${abc})(uid=${xyz})(cn=${cn})(special='${'))", map);
}

private static void printSubstitue(String text, Map<String, String> map) {
    String text2 = subtitue(text, map);
    System.out.println("substitue( "+text+", "+map+" ) = "+text2);
}

public static String subtitue(String template, Map<String, String> map) {
    StringBuilder sb = new StringBuilder();
    int prev = 0;
    for (int start, end; (start = template.indexOf("${", prev)) > 0; prev = end + 1) {
        sb.append(template.substring(prev, start));
        end = template.indexOf('}', start + 2);
        if (end < 0) {
            prev = start;
            break;
        }
        String key = template.substring(start + 2, end);
        String value = map.get(key);
        if (value == null) {
            sb.append(template.substring(start, end + 1));
        } else {
            sb.append(value);
        }

    }
    sb.append(template.substring(prev));
    return sb.toString();
}

печать

substitue( nothing to change, {abc=ABC, xyz=XYZ} ) = nothing to change
substitue( (&(objectclass=${abc})(uid=${xyz})(cn=${cn})(special='${')), {abc=ABC, xyz=XYZ} ) 
     = (&(objectclass=ABC)(uid=XYZ)(cn=${cn})(special='${'))

Беспорядочно, если вы хотите поддерживать вложенные ${ } значения. ;)

abc123=ghi123
abc${xyz}=def${xyz}

(&(objectclass=${abc${xyz}})(uid=${xyz}))

Я бы посоветовал вам не усложнять, если можете. ;)

0 голосов
/ 16 декабря 2011

Такое регулярное выражение работает:

String regex = "(\\$\\{YOUR_TOKEN_HERE\\})";

Вот пример использования:

public static void main(String[] args) throws Exception {
    String[] lines = {
        "(&(objectclass=${abc})(uid=${xyz}))",
        "(&(objectclass=${abc})(uid=${xyz})(xyz=${xyz})(abc=${abc}))"
    };

    String token = "abc"; // or whatever

    String regex = String.format("(\\$\\{%s\\})", token);
    Pattern p = Pattern.compile(regex);
    for (String s: lines) {
        Matcher m = p.matcher(s);
        if (m.find()) {
            System.err.println(m.replaceAll("###"));
        }
    }
}

Выход для токена = "abc":

(&(objectclass=###)(uid=${xyz}))
(&(objectclass=###)(uid=${xyz})(xyz=${xyz})(abc=###))
0 голосов
/ 16 декабря 2011

Необходимое регулярное выражение \$\{[^}]+\}.Замените на все необходимое.

edit: ОК, я неправильно понял вопрос.Исправлено регулярное выражение.

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