[英]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 = '-';
contains
和replaceAll
區分大小寫。 僅僅因為您會在字符串的小寫版本中找到contains
的令牌,並不意味着replaceAll
也將能夠找到它。
例如,字符串"Hello wordl"
和令牌"hello"
line.toLowerCase().contains(words[i].toLowerCase())
將返回true
,但是
line.replaceAll(words[i], c + words[i] + c);
將不起作用,因為words[i]
會hello
但line
會包含Hello
。
其實這種情況什么也沒給你
if (line.toLowerCase().contains(words[i].toLowerCase()))
它遍歷字符串以找到您的單詞,但是replace
或replaceAll
仍必須自己遍歷整個字符串以找到需要替換的匹配部分。
如果要確保無論區分大小寫,都能找到標記,請使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
你也有原來的John
在line
。 這意味着下次您嘗試替換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.