如何仅在两个单词之间出现一次而不是三次出现时才从字符串中删除空格?

时间:2019-09-17 20:27:20

标签: java string

我是从事diff和重新生成算法(但适用于Strings)的初学者。我将补丁存储在文件中。为了从旧的文件中重新生成新的字符串,我使用了该文件。尽管代码可以正常工作,但在使用空间时仍然遇到问题。

我使用replaceAll(" ", "");删除空格。当字符串为[char] [space] [char]时很好,但是当它类似于[space] [space] [space]时会产生问题。在这里,我希望保留该空间(仅保留一个)。

我想到了做replaceAll(" ", " ");。但这会留下[char] [space] [char]类型的空格。我正在使用扫描仪扫描字符串。

有没有办法做到这一点?

Input      Output
 c      => c
cc      => cc
c c     => cc
c  c    => This is not possible. Since there will be padding of one space for each character
c   c   => c c

4 个答案:

答案 0 :(得分:2)

我们还可以将字符串拆分为多个空格,然后使用bundle installStream API将结果数组连接成字符串。

我们还将在Collector操作中使用replaceAll()替换单个空格:

Stream#map

输出:

String test = "   this    is a test of     space in string    ";
//using the pattern \\s{n,} for splitting at multi spaces
String[] arr = test.split("\\s{2,}");
String s = Arrays.stream(arr)
                 .map(str -> str.replaceAll(" ", ""))
                 .collect(Collectors.joining(" "));
System.out.println(s);

答案 1 :(得分:1)

如果要将任何一组空间替换为一个,可以使用:

value.replaceAll("\\s+", " ")

答案 2 :(得分:1)

我不得不使用两个替换项:

String e = "a b   c";
e = e.replaceAll("([A-Z|a-z])\\s([A-Z|a-z])", "$1$2");
e = e.replaceAll("   "," ");
System.out.println(e);

哪些印刷品

  

ab c

第一个用两个字母替换任何字母-空间-字母组合,然后第二个用单个空格替换任何三元-空格。

第一次替换是使用反向引用。 $ 1表示第一组括号内与第一个字母匹配的部分,$ 2表示第二组括号内的部分。

如果输入中有前导/尾随空格,则可以在进行替换之前调用trim()。

e = e.trim()

答案 3 :(得分:1)

您可以使用环顾四周进行替换:

String newText = text
    .replaceAll("(?<! ) (?! )", "")
    .replaceAll(" +", " ");

第一个replaceAll删除所有不被空格包围的空格;第二个用单个空格替换剩余的空格序列。

Ideone example。两个或多个空格的序列变成一个空格,并删除单个空格。

解决方法

在正则表达式中的环视向后看向后看的总称。这些就是所谓的零宽断言,这意味着它们与特定模式匹配,但实际上并不消耗字符。有正面和负面的解决方法。

一个简短的示例:模式Ira(?!q)与子字符串Ira匹配,但前提是它后面没有q。因此,如果输入字符串是Iraq,则不会匹配,但是如果输入字符串是Iran,则匹配项是Ira

更多信息: