2010-10-29 107 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 – 2010-10-29 22:17:20

回答

1

Don't use regular expressions to parse HTML!嘗試使用JTidyany of these適用於Java的開源HTML解析器,它符合您的要求。

使用這些庫將讓你的生活更容易,因爲它們被設計來解析HTML。你可以抓取你想要的節點並從中提取文本。

+0

你不覺得你有點苛刻嗎? – tchrist 2010-10-30 04:18:21

+0

@tchrist我如何苛刻? – 2010-10-30 15:57:05

+0

因爲你不知道海報的具體情況,所以你很苛刻。有限的情況下,模式*可以*用於匹配HTML以達到良好效果。標準的SO教條儘管內容豐富,但可能不夠矯枉過正。如果你知道你的輸入集合,那不是太難。如果你不這樣做,那就是了。看到我的其他更長的評論。 – tchrist 2010-10-30 16:12:41

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 2010-10-29 23:46:50

+2

答案中的錯誤:(1)HTML不區分大小寫; (2)點不符合行結束符; (3)你忘記考慮標準屬性; (4)你不應該在評論或腳本標籤內匹配; (5)最小匹配不保證它不會在格式不正確的輸入中包含重複的打開標記(6),您不應該在引用的屬性中匹配。有可能會有更多的錯誤,但那些只是我的頭頂。不過,這可能會解決他的問題。那麼,這告訴你什麼? – tchrist 2010-10-30 04:26:45

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 2010-10-30 04:57:29

+0

tchrist,正則表達式不是遞歸的,所以它不能匹配嵌套的平衡標籤。有一些正則表達式最近添加了遞歸結構,但它們很難使用。也許「不可能」是一個強詞,許多事情是可能的(但不是可取的)與正則表達式。事實上,我只是從正則表達式標記的wiki @ http://stackoverflow.com/tags/regex/info中引用標準SO教條。一些問題的難度水平太高,以致新手無法正確實施。 – 2010-10-30 06:09:18

+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 2010-10-30 16:07:43