2010-10-29 3 views
0

У меня есть Java строку с текстом и HTML:Java Строковые Операции над HTML теги

<title>test title</title> 
blabla bla more text 

То, что я пытаюсь достичь два раза:

1) Получить содержимое <title></title> и сохранить это в отдельной строке.

2) Удалите эту часть исходной строки: <title>test title</title>

Таким образом, конечный результат будет что-то вроде

originalString:

<title>test title</title> 
blabla bla more text 

NewString:

blabla bla more text 

PAGETITLE : test title

Как я могу это достичь? обычные выражения? Я не могу это понять ...

+1

Это актуально? http://stackoverflow.com/questions/240546/removing-html-from-a-java-string –

ответ

1

Don't use regular expressions to parse HTML! Попробуйте использовать JTidy или any of these парсеров HTML с открытым исходным кодом для Java, соответствующих вашим требованиям.

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

+0

Не кажется ли вам, что вы немного суровы? – tchrist

+0

@tchrist Как я суров? –

+0

Вы суровы, потому что не знаете точных обстоятельств плаката. Существуют ограниченные ситуации, когда шаблоны * могут * использоваться для соответствия HTML с хорошим эффектом. Стандартная догма SO, в то время как хорошо надуманная, может быть недобрым излишеством. Если вы знаете свой набор входных данных, это не слишком сложно. Если вы этого не сделаете, то это так. См. Мой другой, более длинный комментарий. – tchrist

1

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

String s = "<title>test title</title>"; 
    Pattern p = Pattern.compile("<title>(.*?)</title>"); 
    Matcher m = p.matcher(s); 
    while(m.find()){ 
     System.out.println(m.group(1)); 
    } 
+0

Это путь джентльмена! – m88

+2

Ошибки в этом ответе: (1) HTML не чувствителен к регистру; (2) точка не будет соответствовать терминаторам строк; (3) вы забыли указать стандартные атрибуты; (4) вы не должны совпадать с комментариями или тегами скриптов; (5) минимальное совпадение не гарантирует, что он не будет содержать повторяющийся открытый тэг на некорректном входе (6), который не должен совпадать с указанными атрибутами. Вероятно, есть больше ошибок, но это только что с головы. Тем не менее, это, вероятно, решит его проблему. Так что это говорит вам? – tchrist

0

It is inadvisable to parse XML/HTML with regular expressions. Однако, если вы абсолютно необходимо сделать, это вещь, которую вы попросили, попробуйте следующее:

package org.apache.people.mclark.examples.regex; 
import java.util.regex.*; 
public class Regex1 { 
    public static void main(String[] args) { 
     final String subjectString = "<title>test title</title>\n" + 
      "blabla bla more text"; 
     Pattern regex = Pattern.compile("<title>(.*?)</title>(.*)", 
       Pattern.DOTALL); 
     Matcher regexMatcher = regex.matcher(subjectString); 
     if (regexMatcher.find()) { 
      String pageTitle = regexMatcher.group(1); 
      String leftOvers = regexMatcher.group(2); 
      System.out.println("pageTitle[" + pageTitle + "]"); 
      System.out.println("leftOvers[" + leftOvers + "]"); 
     } else { 
      System.out.println("no match"); 
     } 
    } 
} 

Я умываю руки от любого проступка!

+0

Вы не имеете в виду невозможность; вы имеете в виду невероятно трудно получить право в общем случае. (Или вы говорите только о регулярных выражениях учебника, а не о современных шаблонах.) Это может быть несколько проще, чем невозможно, если мы говорим о сфальцованной демонстрационной версии с известным набором конечных входных данных. Возможно, у него есть один из них. Возможно, нет. – tchrist

+0

tchrist, regex не является рекурсивным и поэтому он не может, например, сопоставлять вложенные сбалансированные теги. Есть несколько вариантов регулярных выражений, которые недавно добавили рекурсивные конструкции, но их сложно использовать. Возможно, «невозможно» является сильным словом, многие вещи возможны (но не рекомендуется) с регулярным выражением. Фактически, я просто цитировал стандартную догму SO из вики regex тега @ http://stackoverflow.com/tags/regex/info. Уровень сложности для некоторых проблем настолько высок, что для новичков практически невозможно реализовать правильно. –

+0

Современные шаблоны, безусловно, * являются * [рекурсивными] (http://stackoverflow.com/questions/4031112/regular-expression-matching/4034386#4034386). Но использование их для [соответствия HTML] (http://stackoverflow.com/questions/4044946/regex-to-split-html-tags/4045840#4045840) настолько подвержено ошибкам и затруднено в общем случае, чтобы не быть Стоит усилий. Только для полностью ограниченных наборов входных данных известных характеристик он легко работает, хотя в этих случаях он может часто делать хорошую работу. Втекание материала редко ограничено, как считают люди. – tchrist

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