簡體   English   中英

用Java中的字符串替換字符串

[英]Replacing strings with strings in Java

我有這個字符串:

String line = "Hello John; , my name is also John.";

和這個字符串:

String word = "John";
char c = "-";

並希望此輸出:

"Hello -John-; , my name is also -John-."

到目前為止,這是我設法做到的:

public String changeString(String line, String word, char c){

String result = null;

    if(line.toLowerCase().contains(word.toLowerCase())){

        result = line.replaceAll(word, c + word + c);

    }

return result;
}

但是,使用此功能,我得到以下輸出:

 String result = "Hello -John;- , my name is also -John.-";

我該如何解決?

更新:

如果我只有一個單詞而不是一個數組,我該如何工作?

import java.util.*;
import java.lang.*;
import java.io.*;


class Text
{
    public static void main(String[] args) throws Exception {
        String line = "Hello John; , my name: is also John.";
        String[] words = {"John","name"};
        char c = '-';
        changeString(line, words, c);



 }

 public static void changeString(String line, String[] words, char c) {
    String result = null;

    for(int i = 0; i < words.length; i++){
        if (line.toLowerCase().contains(words[i].toLowerCase())) {
            result = line.replaceAll(words[i], c + words[i] + c);
        }
        else
            result = line;
    }
    System.out.println(result);
    }
}

由於不需要輸出:

"Hello John; , my -name-: is also John."

代替 :

result = line.replaceAll(word, c + word + c);

采用:

result = line.replace(word, c + word + c);

撇開筆記:

您可能正在使用約翰。 而不是john和replaceAll api使用正則表達式作為參數。 字符也用單引號而不是雙引號定義,例如char c = '-';

containsreplaceAll區分大小寫。 僅僅因為您會在字符串的小寫版本中找到contains的令牌,並不意味着replaceAll也將能夠找到它。

例如,字符串"Hello wordl"和令牌"hello"

line.toLowerCase().contains(words[i].toLowerCase())

將返回true ,但是

line.replaceAll(words[i], c + words[i] + c);

將不起作用,因為words[i]helloline會包含Hello

其實這種情況什么也沒給你

if (line.toLowerCase().contains(words[i].toLowerCase()))

它遍歷字符串以找到您的單詞,但是replacereplaceAll仍必須自己遍歷整個字符串以找到需要替換的匹配部分。

如果要確保無論區分大小寫,都能找到標記,請使regex參數不區分大小寫。 您可以通過添加(?i)標志來實現。 但是,如果您想使用正則表達式,還請確保您將轉義它的所有元字符. + * ? 為此,您可以簡單地使用Pattern.quote(regex)

所以你的代碼看起來像

line.replaceAll("(?i)"+Pattern.quote(words[i]),c + words[i] + c);

如果只想匹配整個單詞,則還需要用單詞邊界\\b包圍正則表達式。

line.replaceAll("(?i)\\b"+Pattern.quote(words[i])+"\\b", c + words[i] + c);

您代碼中的第二個問題是

result = line.replaceAll(words[i], c + words[i] + c);` 

您正在用替換line值的新結果覆蓋result當前值。 但是你忘記了那條line不會改變 這意味着,如果要更換John並將其存儲在result你也有原來的Johnline 這意味着下次您嘗試替換name

line.replaceAll(name, ...)

將返回您約翰(無替代)。

要解決此問題,您可以簡單地將替換結果存儲line本身中,例如

line = line.replaceAll(words[i], c + words[i] + c);

而不是一些result


所以您的最終代碼可能如下所示

public static void changeString(String line, String[] words, char c) {
    for (int i = 0; i < words.length; i++) {
        line = line.replaceAll(words[i], c + words[i] + c);
    }
    System.out.println(line);
}

但是,您可能還想解決另一個問題,如果您想用Y替換X並用X替換Y呢? 我的意思是將AB X DE Y FG轉換為AB Y DE X FG

如果您在第一次迭代中使用該方法,則將擺脫所有X元素,並用Y替換它們,這將為您提供

AB X DE Y FG
AB Y DE Y FG

但是在第二種方法中,您將用X替換所有Y

AB Y DE Y FG
AB X DE X FG

最終將為您提供AB X DE X FG而不是AB Y DE X FG

要解決此類問題,您應該考慮在一個循環中查找所有元素,在其中循環訪問所有字符,並檢查它們是否與任何搜索到的元素匹配。 例如,您可以通過使用我以前的答案之一來解決此類問題: 找到模式時進行替換

暫無
暫無

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

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