我有一个类似
的字符串"This is apple tree"
我想删除可用的白色空格,直到单词apple.A更改后它将像
"Thisisapple tree"
我需要在单个替换命令和正则表达式中实现这一点。
答案 0 :(得分:1)
现在看起来你可能正在寻找
String s = "This is apple tree";
System.out.println(s.replaceAll("\\G(\\S+)(?<!(?<!\\S)apple)\\s", "$1"));
输出:Thisisapple tree
。
说明:
\G
表示上一场比赛结束或输入开始(^
),如果之前没有比赛(当我们尝试找到第一场比赛时)\S+
代表一个或多个非空白字符(用于匹配单词,包括非字母字符,如'
或标点符号)(?<!(?<!\\S)apple)\\s
负面观察会阻止接受之前有apple
的空格(我在apple
之前添加了另一个负面观察,以确保它没有任何非空格,以确保这不是其他单词的一部分)$1
表示来自组1(来自(\S+)
)的匹配,表示单词。所以我们用单词替换单词和空格(有效地删除空格)警告:此解决方案假设
如果我们想要摆脱这些假设,我们需要这样的东西:
System.out.println(s.replaceAll("^\\s+|\\G(\\S+)(?<!(?<!\\S)apple)\\s+", "$1"));
^\s+
将允许我们匹配字符串开头的空格(并将其替换为第1组(单词)的内容,在这种情况下将为空,因此我们将只删除这些空格)\s+
最后允许我们匹配单词和后面的一个或多个空格(删除它们)答案 1 :(得分:0)
单个替换()不太可能解决您的问题。你可以这样做......
String s[] = "This is an apple tree, not an orange tree".split("apple");
System.out.println(new StringBuilder(s[0].replace(" ","")).append("apple").append(s[1]));
答案 2 :(得分:0)
这是通过 lookahead断言实现的,如下所示:
String str = "This is an apple tree";
System.out.println(str.replaceAll(" (?=.*apple)", ""));
这意味着:替换前面任何单词 apple
的所有空格答案 3 :(得分:0)
如果您想使用正则表达式,可以尝试:
Matcher matcher = Pattern.compile("^(.*?\\bapple\\b)(.*)$").matcher("This is an apple but this apple is an orange");
System.out.println((!matcher.matches()) ? "No match" : matcher.group(1).replaceAll(" ", "") + matcher.group(2));
这会检查&#34; apple&#34;是一个单词,而不仅仅是另一个单词的一部分,例如&#34; snapple&#34;。它也会在第一次使用&#34; apple&#34;。
时分裂