Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中用字符串替换字符串_Java_Arrays_Regex_String - Fatal编程技术网

在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
的值是多少?(我怀疑是