Добавление HTML-тегов с Java на основе регулярных выражений, сохранение данных в совпадениях - PullRequest
1 голос
/ 27 июля 2010

Используя Java, я пишу скрипт для привязки ссылки к библиографии HTML. Что происходит от: [1,2] до: <a href="o100701.html#bib1">[1, 2]</a>

Я думаю, что нашел правильное выражение регулярного выражения: \[.*?\]

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

Это самое большее, что я могу вспомнить

while(myScanner.hasNext())
{
 line = myScanner.nextLine();
 myMatcher = myPattern.matcher(line);
 ...
 outputBufferedWritter.write(line+"\n");
}

Файлы не очень большие, и там почти всегда меньше 100 совпадений, поэтому меня не волнует производительность.

1 Ответ

2 голосов
/ 27 июля 2010

Прежде всего, я думаю, что лучший шаблон для соответствия содержимому [tag] будет [\[\]]* вместо .*? (т. Е. Все, кроме открывающих и закрывающих скобок).

Для замены, если URLварьируется в зависимости от содержимого [tag], тогда вам необходим явный цикл Matcher.find() в сочетании с appendReplacement/Tail.

Вот пример, который устанавливает Map<String,String> URL-адресов и цикл Matcher.find() длязамена:

    Map<String,String> hrefs = new HashMap<String,String>();
    hrefs.put("[1,2]", "one-two");
    hrefs.put("[3,4]", "three-four");
    hrefs.put("[5,6]", "five-six");

    String text = "p [1,2] \nq [3,4] \nr [5,6] \ns";

    Matcher m = Pattern.compile("\\[[^\\[\\]]*\\]").matcher(text);
    StringBuffer sb = new StringBuffer();
    while (m.find()) {
        String section = m.group(0);
        String url = String.format("<a href='%s'>%s</a>",
            hrefs.get(section),
            section
        );
        m.appendReplacement(sb, url);
    }
    m.appendTail(sb);

    System.out.println(sb.toString());

Это печатает:

p <a href='one-two'>[1,2]</a> 
q <a href='three-four'>[3,4]</a> 
r <a href='five-six'>[5,6]</a> 
s

Обратите внимание, что appendReplacement/Tail не имеет StringBuilder перегрузки, поэтому необходимо использовать StringBuffer.

Ссылки

Смежные вопросы

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