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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我如何用正則表達式替換這個函數(shù)

我如何用正則表達式替換這個函數(shù)

炎炎設(shè)計 2023-04-26 14:28:37
我有一個格式為 yy_MM_someRandomString_originalFileName 的文件名。例子:02_01_fEa3129E_my Pic.png我想將前 2 個下劃線替換為,/以便示例變?yōu)椋?2/01/fEa3129E_my Pic.png這可以用 replaceAll 來完成,但問題是文件也可能包含下劃線。@Testvoid test() {    final var input = "02_01_fEa3129E_my Pic.png";    final var formatted = replaceNMatches(input, "_", "/", 2);    assertEquals("02/01/fEa3129E_my Pic.png", formatted);}private String replaceNMatches(String input, String regex,                               String replacement, int numberOfTimes) {    for (int i = 0; i < numberOfTimes; i++) {        input = input.replaceFirst(regex, replacement);    }    return input;}我使用循環(huán)解決了這個問題,但是有沒有純正則表達式的方法來做到這一點?編輯:這種方式應(yīng)該能夠讓我更改參數(shù)并將下劃線的數(shù)量從 2 增加到 n。
查看完整描述

2 回答

?
慕娘9325324

TA貢獻1783條經(jīng)驗 獲得超4個贊

您可以使用 2 個捕獲組并在替換中使用它們,其中匹配項_將被替換為/

^([^_]+)_([^_]+)_

用。。。來代替:

$1/$2/

正則表達式演示Java演示

例如:

String regex = "^([^_]+)_([^_]+)_";

String string = "02_01_fEa3129E_my Pic.png";

String subst = "$1/$2/";


Pattern pattern = Pattern.compile(regex);

Matcher matcher = pattern.matcher(string);

String result = matcher.replaceFirst(subst);


System.out.println(result);

結(jié)果


02/01/fEa3129E_my Pic.png


查看完整回答
反對 回復(fù) 2023-04-26
?
阿晨1998

TA貢獻2037條經(jīng)驗 獲得超6個贊

您當(dāng)前的解決方案幾乎沒有問題:


這是低效的——因為每個都replaceFirst需要從字符串的開頭開始,所以它需要多次迭代相同的起始字符。


它有一個錯誤- 因為第 1 點。當(dāng)從開始而不是最后修改的地方迭代時,我們可以替換之前插入的值。


例如,如果我們想兩次替換單個字符,每次都用Xlike abc->XXc在代碼 like 之后


String input = "abc";

input = input.replaceFirst(".", "X"); // replaces a with X -> Xbc

input = input.replaceFirst(".", "X"); // replaces X with X -> Xbc

Xbc我們將以instead of結(jié)尾XXc,因為第二個replaceFirst將替換為Xwith Xinstead of bwith X。


為避免此類問題,您可以重寫代碼以使用Matcher#appendReplacement和Matcher#appendTail方法,以確保我們將迭代輸入一次并可以用我們想要的值替換每個匹配的部分


private static String replaceNMatches(String input, String regex,

                               String replacement, int numberOfTimes) {


    Matcher m = Pattern.compile(regex).matcher(input);

    StringBuilder sb = new StringBuilder();

    int i = 0;

    while(i++ < numberOfTimes && m.find() ){

        m.appendReplacement(sb, replacement); // replaces currently matched part with replacement, 

                                              // and writes replaced version to StringBuilder 

                                              // along with text before the match

    }

    m.appendTail(sb); //lets add to builder text after last match

    return sb.toString();

}

使用示例:


System.out.println(replaceNMatches("abcdefgh", "[efgh]", "X", 2)); //abcdXXgh


查看完整回答
反對 回復(fù) 2023-04-26
  • 2 回答
  • 0 關(guān)注
  • 244 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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