2016-12-30 60 views
-2

經過長時間的努力弄清楚如何做特殊的正則表達式,我意識到我無法幫助解決這個問題,只要我是新手在正則表達式中。我的任務是創建正則表達式,它將從HTML源代碼中提取具有度數的名稱。特定的正則表達式名稱與名稱和名稱背後的所有學位

該網站是在這裏http://bacula.nti.tul.cz/~jan.hybs/ada/在那裏你可以明顯發現源代碼,我需要創建正則表達式將採取所有名稱與度。輸出應該看起來像這樣 - 教授。 ING。約瑟夫諾瓦克,博士等 - 簡單地說,所有來自Column名爲「Propojeni」的東西都應該被提取出來。

訂單對我很重要。 (我是填充到一個數組列表。)

我能寫的正則表達式任何一種不同的模式,但不是所有的都顯示在「propojeni」的模式。

我真的很感謝任何有幫助的答案。

+0

你能說出你已經寫過的內容,以及它們在解決這個問題上的不足嗎? –

+0

強制鏈接:http://stackoverflow.com/a/1732454。使用HTML分析器而不是正則表達式。 Jsoup非常好,支持CSS選擇器。 – Pshemo

+0

(Ing | doc | prof)\。\ s [AZ]([az] + | \\ s [az] +)我簡直不能想出解決方案,它將解決開始和結束時的鏈接度結束。 – Rickertbrandsen

回答

0

Proper solution shouldn't involve regex but XML/HTML parser like jsoup

有了這個工具,你的代碼可能是這樣的:

Document doc = Jsoup.connect("http://bacula.nti.tul.cz/~jan.hybs/ada/").get(); 
Elements personel = doc.select("tr td:eq(1)"); 
for (Element person : personel){ 
    System.out.println(person.text()); 
} 

select("tr td:eq(1)")試圖找到所有tr元素,並在他們裏面td其同胞關係指數爲1(從0開始計數)。所以如果一個tr有3個td元素,那麼中間的元素將被索引爲1,這就是我們所追求的。

其中選定元素將代表,如<td><a link="foo"> bar </a></td>將在瀏覽器(與鏈路飾)被打印爲bar,這就是text()將返回Element#text()返回文本。


但是,如果你真的必須使用正則表達式(因爲有人威脅您或您的家人),那麼一個想法是不要把重點放在內容本身,而取決於語境這就保證了內容將在那裏。在你的情況下,它看起來像你可以看看<a href="/zamestnanec/SOME_NUMBER">CONTENT</a>並選擇CONTENT

所以你的正則表達式可以像

String regex = "<a href=\"/zamestnanec/\\d+\">(.*?)</a>"; 

和所有你需要做的是(.*?)提取物含量(這是第1組)。

所以,你的代碼可以看起來像

String regex = "<a href=\"/zamestnanec/\\d+\">(.*?)</a>"; 
Pattern p = Pattern.compile(regex); 
Matcher m = p.matcher(yourHtml); 
while(m.find()){ 
    System.out.println(m.group(1)); 
} 

?(.*?)使得*reluctant,所以它會嘗試找到最小可能的匹配。此代碼將沒有這種?因爲.默認情況下最有可能的工作所無法比擬的行分隔符,但如果你的HTML看起來像

<a href="..">foo</a><a href="bar">bar</a> 

然後(.*)爲正則表達式​​將代表

<a href="..">foo</a><a href="bar">bar</a> 
      ^^^^^^^^^^^^^^^^^^^^^^^^ 

代替

<a href="..">foo</a><a href="bar">bar</a> 
      ^^^