Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.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_Regex - Fatal编程技术网

Java 在每个以给定子字符串结尾的单词后插入一个单词

Java 在每个以给定子字符串结尾的单词后插入一个单词,java,regex,Java,Regex,我需要在文本的每个单词后面,以给定的子字符串结尾, 插入指定的单词。我的代码在某种程度上是有效的,我认为在迭代StringBuilder对象时修改它不是一个好主意。正如你所看到的,它在最后两个例子中失败了,分别是“kalola”和“lalilo”。非常感谢 import java.util.regex.Matcher; import java.util.regex.Pattern; public class TextEditor { public static void main(S

我需要在文本的每个单词后面,以给定的子字符串结尾, 插入指定的单词。我的代码在某种程度上是有效的,我认为在迭代StringBuilder对象时修改它不是一个好主意。正如你所看到的,它在最后两个例子中失败了,分别是“kalola”和“lalilo”。非常感谢

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TextEditor {

    public static void main(String[] args) {

        String text = "Hello Mister James! Do you use trello fregiently? "
                + "Do you know Canelo Pavelo magenta ravelo sagenta! "
                + "lolita kalola lalilo lalita 333l lo.";

        String regex = "\\b\\w+lo\\b";

        String word = " 232 ";

        StringBuilder copyOfText = new StringBuilder(text);

        Pattern pattern = Pattern.compile(regex);

        Matcher matcher = pattern.matcher(copyOfText);

        while(matcher.find()) {
            copyOfText.insert(matcher.end(), word);
        }

        //text = copyOfText.toString();

        System.out.println(copyOfText);
    }
}
收到的输出为:

你好,詹姆斯先生!你经常使用Trello232吗?你…吗 了解Canelo 232 Pavelo 232洋红ravelo 232 sagenta!洛丽塔卡洛 232Lalilo lalita 333l lo

预期产出为:

你好,詹姆斯先生!你经常使用Trello232吗?你…吗 了解Canelo 232 Pavelo 232洋红ravelo 232 sagenta!洛丽塔 卡洛拉利洛232拉利塔333l洛


如注释中所述,您可以使用while循环来代替迭代:

String text = "Hello Mister James! Do you use trello fregiently? "
        + "Do you know Canelo Pavelo magenta ravelo sagenta! "
        + "lolita kalola lalilo lalita 333l lo.";

String word = "232";

System.out.println(text.replaceAll("(\\w+lo\\b)", "$1 " + word));
输出:

你好,詹姆斯先生!你经常使用Trello232吗?你知道吗 Canelo 232 Pavelo 232洋红ravelo 232 sagenta!洛丽塔·卡洛拉·拉利洛 232拉利塔333l洛


为什么不使用replaceAll而不是while循环呢?你的逻辑不是。正如@CAustin提到的,使用replaceAll。非常感谢!美元符号和数字在这里是什么意思“$1”?括号中的正则表达式是a。
$1
将捕获的组包括在替换字符串中。如果你不包括它,那么所有匹配的单词(“Hello”、“trello”…)将完全被“232”取代。在这种情况下,你不需要一个捕获组。你只需要参考完整的比赛。只需执行
text.replaceAll(\\w+lo\\b“,“$0”+word)
即可节省一些字符。此外,如果
word
包含literal
\
$0
/
$1
子字符串,则会以非常意外的方式工作。