仅在字符串的一部分中替换空格

时间:2016-06-24 18:14:31

标签: java string

我有一个类似

的字符串
"This is apple tree"

我想删除可用的白色空格,直到单词apple.A更改后它将像

"Thisisapple tree"

我需要在单个替换命令和正则表达式中实现这一点。

4 个答案:

答案 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;。

时分裂