簡體   English   中英

Java String replaceAll遞歸行為

[英]Java String replaceAll Recursive behavior

昨天我正在制作定制的信件和備忘錄。 我制作了映射關鍵字,如:[Dateofbirth],[Email],[Employee],[Salary]等,它們將在生成時替換。

示例:親愛的[員工],您的當前薪水是[薪水]。

預期產量:

輸出:親愛的約翰,你目前的薪水是12000。

我在這里使用replaceAll()方法是一個代碼。

   String str = "dear [Employee], your Current Salary is [Salary].";
        Map<String,String> vals = new HashMap<String,String>();
        vals.put("[Employee]","John");
        vals.put("[Salary]","12000");
        for(String key:vals.keySet()){
            str=str.replaceAll(key,vals.get(key));
        }
        System.out.println(str);

但是出來的是:

dJohn1200012000 [JohnJohnJohnJohnJohnJohnJohnJohn], JohnJohnu12000 Cu1200012000Johnnt 1200012000John1200012000John is [1200012000John1200012000John].

我很困惑,谷歌搜索它並嘗試使其正確,之后我用replace()更改了replaceAll() replace()

EX: str=str.replace(key,vals.get(key));

現在工作正常。 問題是為什么替換所有正在做這種行為的是replaceAll()的核心概念以及何時使用replace()何時使用replaceAll() 謝謝

在討論您的問題之前,我希望您了解Java API具有的String#格式 有了它,你可以簡單地寫

String formattedString = String.format("dear %s, your Current Salary is %.2f", "John", 12000.45);
System.out.println(formattedString);

如果您在不可避免的情況下自己這樣做, replaceAll會將第一個參數視為正則表達式而不是要替換的普通字符串。

來自replaceAll的文檔。

將給定替換的給定正則表達式匹配的此字符串的每個子字符串替換。

由於您的參數由[]組成,因此它們與其中的每個字符匹配。

如果您擺脫它會成功[]和使用任何其他特殊字符不屬於對前元字符#

    String str = "dear #Employee#, your Current Salary is #Salary#.";
    Map<String, String> vals = new HashMap<String, String>();
    vals.put("#Employee#", "John");
    vals.put("#Salary#", "12000");
    for (String key : vals.keySet()) {
        str = str.replaceAll(key, vals.get(key));
    }
    System.out.println(str);

給你

dear John, your Current Salary is 12000.

或者直接使用最后所說的replace()

讓我們看一下replace和replaceAll方法的javadoc。 轉到javadocs

更換

public String replace(CharSequence target, CharSequence replacement)

將與該文字目標序列匹配的此字符串的每個子字符串替換為指定的文字替換序列。 替換從字符串的開頭到結尾,例如,在字符串“aaa”中將“aa”替換為“b”將導致“ba”而不是“ab”。

因此,簡單來說,它用替換詞替換所有目標詞。

全部替換

public String replaceAll(String regex, String replacement)

將給定替換的給定正則表達式匹配的此字符串的每個子字符串替換。

要理解給定的行為,了解正則表達式的工作原理非常重要。 正則表達式是一個獨立的世界,但是,我們可以在這里討論給定的正則表達式。

方括號將一組字符組合在一起。 調用時,該集合中的任何字符都匹配。

例如:[abc]將匹配所有a,b和c。 由於replaceAll使用正則表達式匹配,它將用替換字符串替換所有a,b和c。

replaceAll()匹配使用正則表達式
使用純文本replace()匹配。

正則表達式[Employee]是一個字符類 ,它匹配任何單個字符,即Employe

replaceAll將第一個參數視為正則表達式。 所以你需要逃避正則表達式特定的字符,在你的情況下[和]。 它們表示一組字符,因此replaceAll匹配該集合中的每個字符並替換為您提供的值。 試試這個以獲得你想要的輸出 -

vals.put("\\[Employee\\]","John");
vals.put("\\[Salary\\]","12000");

在這里,我們已經逃脫了特殊符號[和],因此它不再將其視為一組。

工作計划 - https://www.ideone.com/2hCbIM

ReplaceAll編譯正則表達式並應用於字符串。 在這種情況下,由於你的密鑰有'[',它會匹配其中的任何字符。 因此,對於每次出現,它都已替換為該值

replaceAll()需要一個正則表達式,replace()需要精確的字符串(char序列)。 正則表達式需要轉義特殊字符。 因此,當需要簡單地替換字符串時使用replace()方法,並且當需要匹配正則表達式並需要替換它時,請使用replaceAll()。

此鏈接可能對您有所幫助。 基本上,唯一的區別是replaceAll替換所有匹配regex作為參數提供的字符串,而replace()替換基於chars

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM