2017-02-18 1986 views
1

這是關於解析HTML的內聯CSS樣式屬性。我正在使用JSoup,但據我所知,JSoup選擇不提供幫助......我不知道爲什麼。這意味着用戶必須找出關鍵和值等合法字符的規則,即什麼構成了「正確形成的」CSS樣式「屬性」(這是否是正確的術語?)[以後:否!風格「屬性」,根據CSSParser])。正則表達式「分號或字符串末尾」

無論如何,在提取每個單獨的鍵值對時,我想要用分號將它們分開......但在最後一對中,尾隨分號是可選的。但是,考慮到空白區域,它將以字符串的結尾結束。

所以,我想這一點:

Pattern styleSubattrsPattern = Pattern.compile("([A-Za-z0-9-]+)\\s*:\\s*([A-Za-z0-9-]+)\\s*[$;]"); 

...的意思是指「任何一個分號或字符串的結尾」。但它不起作用:最終的鍵值對不匹配。

問題的根源確實使用CSSParser解決。

+0

'([^; ])''如果你不想匹配';'(這意味着*後面跟着一個不是';'*的字符),就應該這樣做; –

+0

有趣......似乎工作... Tx爲了解釋......只是試圖讓我的頭靠近在! –

+0

實際上,您的斜體短語可以精確地總結出需要的內容......並且可能與瀏覽器算法必須解析的方式相對應......所以也許您應該對此做出答案? –

回答

2

使用[$;]將匹配分號或美元符號,因爲[]中的封閉特殊字符將引用字符文字(除開始處的^用於反轉匹配外)。

你可能想要的是這樣的:((;)|($))

或者,你也可以用問號來表示一個可選的字符,如果你希望最終的行分號後:;?$

+0

優秀...感謝您的解釋。是的,*最後的尾部*分號當然是可選的:實際上我現在把'((;?)|($))''。 –

+0

沒問題@mikerodent,讓我知道如何爲你工作。 – Tyzoid

+0

PS * *出現*,實際上你不需要內部括號:這看起來工作正常:'(;?| $)'。 –

1

您可以使用負前向斷言一個否定的字符類做到這一點:(?![^;])

這種處理兩種情況:

  • ,如果有一個字符,這個只能是一個;
  • 否則,只允許字符串的末尾(無字符)。

這樣:

Pattern styleSubattrsPattern = Pattern.compile("([A-Za-z0-9-]+)\\s*:\\s*([A-Za-z0-9-]++)\\s*+(?![^;])"); 

(I加入所有格量詞禁止回溯和避免無用的測試:* =>*++ =>++)?!

+0

這似乎是一個過於複雜的方式,以避免';'成爲比賽的一部分。 –

+0

如果你認爲這很複雜,寫20條代碼行以避免它。 –

相關問題