Регулярное выражение для сопоставления ссылки href и замены ее на <b></b> - PullRequest
1 голос
/ 26 марта 2012

Я пытаюсь сделать что-то довольно простое, но я просто сосу регулярные выражения.

Моя цель - заменить:

<a href="http://www.google.com">Link To Google</a>

Кому:

<b>Link To Google</b>

В Яве.

Я пробовал это:

String input = "<a href=\"http://www.google.com\">Link to Google</a>";
String Regex1 = "<a href(.*)>";
String Regex2 = "</a>";
String output = test.replace(Regex1, "<b>");
output = test.replace(Regex2, "</b>");

Но первый Regex1 не соответствует моему вводу. Любая подсказка?

Заранее спасибо!

Ответы [ 4 ]

2 голосов
/ 26 марта 2012

Это очень хорошо, даже если это неправильно, и вы не должны использовать регулярные выражения для разбора HTML.

Вы хотите сделать вторую замену в результате первой замены, а не в исходной строке:

String output = test.replace(Regex1, "<b>");
output = output.replace(Regex2, "</b>");

Вы можете заставить его работать для вашего примера, используя:

String Regex1 = "<a href.*?>";

Что делает квантификатор несвязным. Но это выражение легко сломается очень из-за малейших изменений во входном HTML, что (одна из причин) почему вы не должны использовать регулярные выражения для работы с HTML.

Некоторые простые примеры, для которых приведенное выше регулярное выражение не работает:

<A HREF="http://www.google.com">
<a  href="http://www.google.com">
<a href="http://www.google.com"
>
<a href=">">
1 голос
/ 26 марта 2012

Использовать парсер.Они просты в использовании и всегда являются более правильным решением.

jsoup (http://jsoup.org) легко справится с вашей задачей так:

File input = new File("your.html");
Document doc = Jsoup.parse(input, "UTF-8");

Elements links = doc.select("a[href]");

while (links.hasNext()) {
  Element link = iterator.next();
  Element bold = doc.createElement("b").appendText(link.text());
  link.replaceWith(bold);
} 

// now do something with...
// doc.outerHtml()
0 голосов
/ 26 марта 2012

Не знаю об использовании регулярных выражений в Java, но должно быть понятие "группа захвата":

Ваше первоначальное регулярное выражение будет: "<a\s+href\s*=\s*".*?">(.*?)</a>"

Что бы вы заменили на: "<b>$1</b>" (где $ 1 означает группу, заключенную в круглые скобки в первом регулярном выражении)

0 голосов
/ 26 марта 2012

Если вы хотите, чтобы это работало, замените Regex1 на

<a href=\"(.*)\">

А потом:

output = output.replace(Regex2,"</b>")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...