第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

正則表達(dá)式:如何用出現(xiàn) n 次的子字符串替換字符串

正則表達(dá)式:如何用出現(xiàn) n 次的子字符串替換字符串

ibeautiful 2021-09-03 13:56:55
作為前提,我有一個(gè) HTML 文本,其中包含一些<ol>元素。它們有一個(gè)start屬性,但我使用的框架無法在 PDF 轉(zhuǎn)換期間解釋它們。所以,我試圖應(yīng)用的技巧是在開始時(shí)添加一些不可見的<li>元素。例如,假設(shè)這個(gè)輸入文本:<ol start="3">   <li>Element 1</li>   <li>Element 2</li>   <li>Element 3</li></ol>我想產(chǎn)生這樣的結(jié)果:<ol>   <li style="visibility:hidden"></li>   <li style="visibility:hidden"></li>   <li>Element 1</li>   <li>Element 2</li>   <li>Element 3</li></ol>因此,將 n-1 個(gè)不可見元素添加到有序列表中。但是我無法以通用的方式從 Java 中做到這一點(diǎn)。假設(shè)示例中的確切情況,我可以這樣做(使用replace,所以 - 老實(shí)說 - 沒有正則表達(dá)式):htmlString = htmlString.replace("<ol start=\"3\">",            "<ol><li style=\"visibility:hidden\"></li><li style=\"visibility:hidden\"></li>");但是,顯然,它只適用于“start=3”的情況。我知道我可以使用組來提取“3”,但是如何將它用作“變量”來指定字符串<li style=\"visibility:hidden\"></li>n-1 次?感謝您的任何見解。
查看完整描述

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));

}


查看完整回答
反對(duì) 回復(fù) 2021-09-03
?
吃雞游戲

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ù)量)


查看完整回答
反對(duì) 回復(fù) 2021-09-03
  • 3 回答
  • 0 關(guān)注
  • 187 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)