3 回答

TA貢獻(xiàn)1839條經(jīng)驗(yàn) 獲得超15個(gè)贊
從 Java 9 開始,有一種Matcher.replaceAll方法將回調(diào)函數(shù)作為參數(shù):
String text = "<ol start=\"3\">\n\t<li>Element 1</li>\n\t<li>Element 2</li>\n\t<li>Element 3</li>\n</ol>";
String result = Pattern
.compile("<ol start=\"(\\d)\">")
.matcher(text)
.replaceAll(m -> "<ol>" + repeat("\n\t<li style=\"visibility:hidden\" />",
Integer.parseInt(m.group(1))-1));
對(duì)于repeat字符串,您可以從這里開始使用技巧,或者使用循環(huán)。
public static String repeat(String s, int n) {
return new String(new char[n]).replace("\0", s);
}
之后result是:
<ol>
<li style="visibility:hidden" />
<li style="visibility:hidden" />
<li>Element 1</li>
<li>Element 2</li>
<li>Element 3</li>
</ol>
如果您堅(jiān)持使用舊版本的 Java,您仍然可以分兩步進(jìn)行匹配和替換。
Matcher m = Pattern.compile("<ol start=\"(\\d)\">").matcher(text);
while (m.find()) {
int n = Integer.parseInt(m.group(1));
text = text.replace("<ol start=\"" + n + "\">",
"<ol>" + repeat("\n\t<li style=\"visibility:hidden\" />", n-1));
}
由 Andrea ジーティーオー 更新:
我修改了上面的(很棒的)解決方案,以包含<ol>具有多個(gè)屬性的內(nèi)容,以便它們的標(biāo)簽不以start(例如,<ol>帶有字母, as <ol start="4" style="list-style-type: upper-alpha;">)結(jié)尾。這用于replaceAll整體處理正則表達(dá)式。
//Take something that starts with "<ol start=", ends with ">", and has a number in between
Matcher m = Pattern.compile("<ol start=\"(\\d)\"(.*?)>").matcher(htmlString);
while (m.find()) {
int n = Integer.parseInt(m.group(1));
htmlString = htmlString.replaceAll("(<ol start=\"" + n + "\")(.*?)(>)",
"<ol $2>" + StringUtils.repeat("\n\t<li style=\"visibility:hidden\" />", n - 1));
}

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊
你不能使用正則表達(dá)式來做到這一點(diǎn),或者即使你找到了一些技巧來做到這一點(diǎn),這也將是一個(gè)次優(yōu)的解決方案..
正確的方法是使用 HTML 解析庫(例如Jsoup),然后將<li>
標(biāo)記作為子項(xiàng)添加到<ol>
,特別是使用Element#prepend方法。(使用 Jsoup,您還可以讀取start
屬性值以計(jì)算要添加的元素?cái)?shù)量)
添加回答
舉報(bào)