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