我是从事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
答案 0 :(得分:2)
我们还可以将字符串拆分为多个空格,然后使用bundle install
和Stream
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
。
更多信息: