16 дек. 2012 г., 14:37 от ThreaT

Заменить, пока шаблон найден

Я пытаюсь пройти строку и заменить все экземпляры строки, совпадающей с регулярным выражением. По какой-то причине, когда я используюif тогда он сработает и заменит только один строковый экземпляр регулярного выражения. Когда я меняюif вwhile затем он делает какую-то странную замену над собой и создает беспорядок в первой строке, совпадающей с регулярным выражением, даже не касаясь остальных ...

        pattern = Pattern.compile(regex);
        matcher = pattern.matcher(docToProcess);
        while (matcher.find()) {
            start = matcher.start();
            end = matcher.end();
            match = docToProcess.substring(start, end);
            stringBuilder.replace(start, end, createRef(match));
            docToProcess = stringBuilder.toString();
        }

Ответы на вопрос (0)

16 дек. 2012 г., 14:47 от Will C.

длина которой не равна (end - start), то индексы, которые вы используете в docToProcess.substring (start, end), потенциально могут перекрываться.

16 дек. 2012 г., 15:00 от jlordo

поможет ли это:

// your snippet:    
pattern = Pattern.compile(regex);
matcher = pattern.matcher(docToProcess);
while (matcher.find()) {
    start = matcher.start();
    end = matcher.end();
    match = docToProcess.substring(start, end);
    String rep = createRef(match);
    stringBuilder.replace(start, end, rep);
    docToProcess = stringBuilder.toString();
    // my addition:
    System.out.println("Found:         '" + matcher.group() + "'");
    System.out.println("Replacing with: '" + rep + "'");
    System.out.println(" --> " + docToProcess);
    matcher = pattern.matcher(docToProcess);
}
16 дек. 2012 г., 15:11 от Pshemo

какая у вас проблема, но, может быть, этот пример немного поможет:

Я хочу изменить имена в предложении, как:

Джек -> АльбертАльберт -> ПавелПол -> Джек

Мы можем сделать это с небольшой помощьюappendReplacement а такжеappendTail методы изMatcher учебный класс

//this method can use Map<string,string>, or maybe even be replaced with Map.get(key)
static String getReplacement(String name) { 
    if ("Jack".equals(name))
        return "Albert";
    else if ("Albert".equals(name))
        return "Paul";
    else
        return "Jack";
}

public static void main(String[] args) {

    String sentence = "Jack and Albert are goint to see Paul. Jack is tall, " +
            "Albert small and Paul is not in home.";

    Matcher m = Pattern.compile("Jack|Albert|Paul").matcher(sentence);

    StringBuffer sb = new StringBuffer();

    while (m.find()) {
        m.appendReplacement(sb, getReplacement(m.group()));
    }
    m.appendTail(sb);

    System.out.println(sb);
}
</string,string>

Выход:

Albert and Paul are goint to see Jack. Albert is tall, Paul small and Jack is not in home.

ВАШ ОТВЕТ НА ВОПРОС