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>
^^^
你能說出你已經寫過的內容,以及它們在解決這個問題上的不足嗎? –
強制鏈接:http://stackoverflow.com/a/1732454。使用HTML分析器而不是正則表達式。 Jsoup非常好,支持CSS選擇器。 – Pshemo
(Ing | doc | prof)\。\ s [AZ]([az] + | \\ s [az] +)我簡直不能想出解決方案,它將解決開始和結束時的鏈接度結束。 – Rickertbrandsen