Многострочное регулярное выражение Java для замены нескольких экземпляров в файле - PullRequest
0 голосов
/ 16 марта 2011

ОК, поэтому я часами искал свою проблему, но, похоже, ничего не произошло.Итак, вот мой фрагмент кода, за которым следует проблема:

Pattern forKeys = Pattern.compile("^<feature>\\s*<name>Deviation</name>.*?</feature>", Pattern.DOTALL|Pattern.MULTILINE);
Matcher n = forKeys.matcher("");
String aLine = null;
    while((aLine = in.readLine()) != null) {
         n.reset(aLine);
         String result = n.replaceAll("");
         out.write(result);
         out.newLine();
    }

давайте просто предположим, что необъявленные переменные уже объявлены.не работает должным образом.

Я хочу стереть детали с помощью «<feature><name>Deviation</name>*any character/s here*</feature>», включенного в строки ff:

<feature>
    <name>Deviation</name>
            <more words here>
</feature>
<feature>
    <name>Average</name>
</feature>
    <feature>
    <name>Deviation</name>
            sample words
</feature>

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

Есть идеи?Заранее спасибо.

1 Ответ

0 голосов
/ 16 марта 2011

Разбор HTML или XML с регулярным выражением является злым и подверженным ошибкам .

Используйте синтаксический анализатор XML, и все будет работать намного лучше.
Вот решение вашей проблемы с использованием Dom4J :

// parse XML source
Document document = DocumentHelper.parseText(yourXmlText);

Iterator<Element> featureIterator =
    // get an iterator for all <feature> elements
    document.getRootElement().elementIterator("feature");

while(featureIterator.hasNext()){
    Element featureElement = featureIterator.next();
    // if <feature> has a child <name> with Content "Deviation"
    if("Deviation").equals(featureElement.elementTextTrim("name")){
        // remove this <feature> element
        featureIterator.remove();
    }
}

// write modified XML back to file
new XMLWriter(
    new FileOutputStream(yourXmlFile), OutputFormat.createPrettyPrint()
).write(document);

Кроме того, вы также делаете ошибку (см. Мои комментарии):

// aLine is just a single line
while((aLine = in.readLine()) != null) {
     n.reset(aLine);
     // yet you want to replace a multi-line pattern
     String result = n.replaceAll("");
     out.write(result);
     out.newLine();
}

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

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