在Java中用字符串替换字符串
我有这个字符串:在Java中用字符串替换字符串,java,arrays,regex,string,Java,Arrays,Regex,String,我有这个字符串: String line = "Hello John; , my name is also John."; 这个字符串: String word = "John"; char c = "-"; 并希望得到以下输出: "Hello -John-; , my name is also -John-." String result = "Hello -John;- , my name is also -John.-"; 到目前为止,我已经做到了以下几点: public Str
String line = "Hello John; , my name is also John.";
这个字符串:
String word = "John";
char c = "-";
并希望得到以下输出:
"Hello -John-; , my name is also -John-."
String result = "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;
}
但是,通过此函数,我得到以下输出:
"Hello -John-; , my name is also -John-."
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);
}
}
而不是:
result = line.replaceAll(word, c + word + c);
使用:
旁注:
你可能在利用约翰。api使用正则表达式作为参数,而不是john和replaceAll。此外,字符是用单引号定义的,而不是像charc='-'这样的双引号代码>而不是:
result = line.replaceAll(word, c + word + c);
使用:
旁注:
你可能在利用约翰。api使用正则表达式作为参数,而不是john和replaceAll。此外,字符是用单引号定义的,而不是像charc='-'这样的双引号代码>包含
,replaceAll
区分大小写。仅仅因为您将在字符串的小写版本中找到带有contains
的令牌,并不意味着replaceAll
也能找到它
例如,像“Hello wordl”
和令牌“Hello”
将返回true
,但
line.replaceAll(words[i], c + words[i] + c);
将不起作用,因为单词[i]
将是hello
,但行将包含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);`
您正在用替换行中的值的新结果覆盖结果的当前值。但是您忘记了,行
不会更改。这意味着,如果您替换了John
并将其存储在结果中
,则行中仍将保留原始John
。这意味着下一步您将尝试替换name
line.replaceAll(name, ...)
我会把约翰还给你(不需要替换)
要纠正此问题,您只需将替换结果存储在行中
line = line.replaceAll(words[i], c + words[i] + c);
而不是一些结果
因此,最终的代码可以如下所示
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);
}
但在第二种方法中,您将用X
替换所有Y
AB Y DE Y FG
AB X DE X FG
这将最终为您提供AB X DE X FG
而不是AB Y DE X FG
为了解决这类问题,你应该考虑在一个循环中找到所有元素,在其中你将遍历所有字符并检查它们是否匹配任何搜索元素。例如,您可以使用我以前的一个答案来解决这类问题:
包含
和replaceAll
区分大小写。仅仅因为您将在字符串的小写版本中找到带有contains
的令牌,并不意味着replaceAll
也能找到它
例如,像“Hello wordl”
和令牌“Hello”
将返回true
,但
line.replaceAll(words[i], c + words[i] + c);
将不起作用,因为单词[i]
将是hello
,但行将包含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);`
您正在用替换行中的值的新结果覆盖结果的当前值。但是您忘记了,行
不会更改。这意味着,如果您替换了John
并将其存储在结果中
,则行中仍将保留原始John
。这意味着下一步您将尝试替换name
line.replaceAll(name, ...)
我会把约翰还给你(不需要替换)
要纠正此问题,您只需将替换结果存储在行中
line = line.replaceAll(words[i], c + words[i] + c);
而不是一些结果
因此,最终的代码可以如下所示
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);
}
但在第二种方法中,您将用X
替换所有Y
AB Y DE Y FG
AB X DE X FG
这将最终为您提供AB X DE X FG
而不是AB Y DE X FG
为了解决这类问题,你应该考虑在一个循环中找到所有元素,在其中你将遍历所有字符并检查它们是否匹配任何搜索元素。例如,您可以使用我前面的一个答案来解决此类问题:
显示调用此方法的代码。具体来说,word
的值是多少?(我怀疑是