Java Regex - Как заменить шаблон или как - PullRequest
3 голосов
/ 15 февраля 2012

У меня есть куча файлов HTML. В этих файлах мне нужно исправить атрибут src тэгов IMG. Теги IMG обычно выглядят так:

<img alt="" src="./Suitbert_files/233px-Suitbertus.jpg" class="thumbimage" height="243" width="233" />`

где атрибуты НЕ в каком-либо определенном порядке. Мне нужно удалить точку и косую черту в начале атрибута src тегов IMG, чтобы они выглядели так:

<img alt="" src="Suitbert%20%E2%80%93%20Wikipedia_files/233px-Suitbertus.jpg" class="thumbimage" height="243" width="233" />

Пока у меня есть следующий класс:

import java.util.regex.*;


public class Replacer {

    // this PATTERN should find all img tags with 0 or more attributes before the src-attribute
    private static final String PATTERN = "<img\\.*\\ssrc=\"\\./";
    private static final String REPLACEMENT = "<img\\.*\\ssrc=\"";
    private static final Pattern COMPILED_PATTERN = Pattern.compile(PATTERN,  Pattern.CASE_INSENSITIVE);


    public static void findMatches(String html){
        Matcher matcher = COMPILED_PATTERN.matcher(html);
        // Check all occurance
        System.out.println("------------------------");
        System.out.println("Following Matches found:");
        while (matcher.find()) {
            System.out.print("Start index: " + matcher.start());
            System.out.print(" End index: " + matcher.end() + " ");
            System.out.println(matcher.group());
        }
        System.out.println("------------------------");
    }

    public static String replaceMatches(String html){
        //Pattern replace = Pattern.compile("\\s+");
        Matcher matcher = COMPILED_PATTERN.matcher(html);
        html = matcher.replaceAll(REPLACEMENT);
        return html;
    }
}

Итак, мой метод findMatches(String html), кажется, правильно находит все теги IMG, где атрибуты src начинаются с ./.

Теперь мой метод replaceMatches(String html) неправильно заменяет совпадения. Я новичок в регулярных выражениях, но я предполагаю, что либо регулярное выражение REPLACEMENT является неправильным, либо используется метод replaceAll, либо оба варианта. Как видите, замещающая строка содержит 2 части, которые идентичны во всех тегах IMG: <img и src="./. Между этими двумя частями должно быть 0 или более атрибутов HTML из исходной строки. Как мне сформулировать такую ​​строку ЗАМЕНА? Может кто-нибудь, пожалуйста, просветите меня?

Ответы [ 4 ]

7 голосов
/ 15 февраля 2012

Не используйте регулярные выражения для HTML.Используйте парсер , получите атрибут src и замените его.

5 голосов
/ 15 февраля 2012

Попробуйте это:

PATTERN = "(<img[^>]*\\ssrc=\")\\./"
REPLACEMENT = "$1"

По сути, вы захватываете все, кроме ./ в группе # 1, а затем снова подключаете его, используя заполнитель $1, эффективно удаляя ./.

Обратите внимание, как я изменил ваш .* на [^>]* тоже. Если в одной строке было два тега IMG, например:

<img src="good" /><img src="./bad" />

... ваше регулярное выражение будет соответствовать этому:

<img src="good" /><img src="./

Это сделало бы это, даже если бы вы использовали не жадный .*?. [^>]* гарантирует, что совпадение всегда содержится в одном теге.

1 голос
/ 15 февраля 2012

Ваша замена неверна.Он заменит найденную строку заменой (не интерпретируется как регулярное выражение).Если вы хотите добиться того, чего хотите, вам нужно использовать группы.Группа ограничена круглыми скобками регулярного выражения.Каждая открывающая скобка указывает на новую группу.Вы можете использовать $ i в строке замены, чтобы воспроизвести то, что соответствует группе и где «i» - это номер вашей группы.Подробности смотрите в документе appendReplacement.

// Here is an example (it looks a bit like your case but not exactly)
String input = "<img name=\"foobar\" src=\"img.png\">";
String regexp = "<img(.+)src=\"[^\"]+\"(.*)>";
Matcher m = Pattern.compile(regexp).matcher(input);
StringBuffer sb = new StringBuffer();
while(m.find()) {
    // Found a match!
    // Append all chars before the match and then replaces the match by the 
    // replacement (the replacement refers to group 1 & 2 with $1 & $2
    // which match respectively everything between '<img' and 'src' and,
    // everything after the src value and the closing >
    m.appendReplacement(sb, "<img$1src=\"something else\"$2>";
}
m.appendTail(sb);// No more match, we append the end of input

Надеюсь, это поможет вам

0 голосов
/ 15 февраля 2012

Если src атрибуты встречаются только в вашем HTML в тегах img, вы можете просто сделать это:

input.replace("src=\"./", "src=\"")

Вы также можете сделать это без Java с помощью sed, если вы используете * nix OS

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