Ответ 1
NOTA:
Я надеюсь, что эта дискуссия будет полезной для случайного читателя и/или googler и станет "окном мира" в войне Regex vs HTML Parser.
Решение №1: с регулярным выражением
Пример кода
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class HelloWorld {
public static void main(String []args){
String sentence = "Most implementations<img title=\"hello:\" alt=\"hello:{}\" src=\"http://images.doctissimo.fr/hello.gif\" class=\"wysiwyg_smiley\" /> provide ASDF as a module, and you can simply (require \"asdf\").";
String RegEx = "(?is)(\\w+|[\u00E0\u00C0\u00E2\u00C2\u00E4\u00C4\u00E1\u00C1\u00E9\u00C9\u00E8\u00C8\u00EA\u00CA\u00EB\u00CB\u00EC\u00CC\u00EE\u00CE\u00EF\u00CF\u00F2\u00D2\u00F4\u00D4\u00F6\u00D6\u00F9\u00D9\u00FB\u00DB\u00FC\u00DC\u00E7\u00C7\u2019\u00F1]+)(<[^>]+>)?";
Pattern mypattern = Pattern.compile(RegEx);
Matcher myMatcher = mypattern.matcher(sentence);
String output=myMatcher.replaceAll("<font color=\"white\">$1</font>$2");
System.out.println(output);
}
}
Выход
<font color="white">Most</font> <font color="white">implementations</font> <img title="hello:" alt="hello:{}" src="http://images.doctissimo.fr/hello.gif" class="wysiwyg_smiley" /> <font color="white">provide</font> <font color="white">ASDF</font> <font color="white">as</font> <font color="white">a</font> <font color="white">module</font>, <font color="white">and</font> <font color="white">you</font> <font color="white">can</font> <font color="white">simply</font> (<font color="white">require</font> "<font color="white">asdf</font>").
Решение №2: с Jsoup
Пример кода
import org.jsoup.Jsoup;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.TextNode;
public class HelloWorldWithJsoup {
public static void main(String[] args) {
String sentence = "Most implementations<img title=\"hello:\" alt=\"hello:{}\" src=\"http://images.doctissimo.fr/hello.gif\" class=\"wysiwyg_smiley\" /> provide ASDF as a module, and you can simply (require \"asdf\").";
Element body = Jsoup.parse(sentence).body();
for (TextNode textNode : body.textNodes()) {
textNode.wrap("<font color=\"white\"></font>");
}
System.out.println(body.html());
}
}
Выход
<font color="white">Most implementations</font>
<img title="hello:" alt="hello:{}" src="http://images.doctissimo.fr/hello.gif" class="wysiwyg_smiley" />
<font color="white"> provide ASDF as a module, and you can simply (require "asdf").</font>
Обсуждение
Сравним оба подхода:
Количественно
За исключением импорта оба кода имеют одинаковые строки кода. Исключая основные классы, предлагаемые JDK и классы, созданные под обложкой, для решения № 2 требуются 3 дополнительных класса (Jsoup
, Element
и TextNode
), а для решения № 1 требуется 2 (Matcher
, Pattern
), Решение № 2 требует, чтобы вы вложили зависимость внутри вашего кода, в то время как решение № 1 готово из коробки с JDK.
Качественно
С точки зрения удобочитаемости они оба прямолинейны. Тем не менее, для неподтвержденного Java API-анализатора регулярных выражений может быть сложно понять код. С точки зрения важности регулярное выражение используется здесь довольно долго, и вам нужны возможности unicode. Решение Jsoup опирается только на хорошо документированные методы. Наконец, выпуск Jsoup более уважительно относится к практике HTML. Используются теги font
.
Сравнительная матрица
Quantitatively: | Regex vs Jsoup
--------------------------------------
Lines of code | O O
Classes used | O X
Dependency required | O X
Qualitatively: | Regex vs Jsoup
--------------------------------------
Readability | O O
Maintenability | X O
HTML good practices | X O
Как вы можете видеть, битва заканчивается draw.
Заключение
IMO, в этом случае выбор между одним или другим решением будет сильно зависеть от результата , полученного, каждым решением и ожидаемым результат. Решение Jsoup рисует символы типа ,
или )
в белом цвете. Подходом регулярного выражения нет. Для конечного пользователя, какой желаемый результат, приведет к тому или иному решению.