如何在保留空格的情况下使用split()函数分割字符串

10

如何分割包含空格的字符串并保留空格?

这里是代码:

String words[] = s.split(" "); 

字符串s包含:hello world

代码运行后,words[]包含:"hello" "" world

理想情况下,中间不应该是空字符串,而应该包含两个空格:words[]应该是:"hello" " " " " world

我该如何使它得到这个结果?


为什么你不想修剪你的字符串? - bish
因为我需要保持用户输入的原文,这是规格的一部分。 - Rock Lee
2
String.split会删除你提供给它的分隔符(在这种情况下是空格)。如果你想要不同的行为,你需要自己实现一个split的变体。 - Chronio
@Chronio,现有的API可以支持它。为什么要重复造轮子呢? - Mox
4个回答

16
你可以使用正向/反向预查来实现此功能:lookahead/lookbehind
String[] words = "hello  world".split("((?<=\\s+)|(?=\\s+))");

(?<=\s+)(?=\s+)是零宽度正回顾后发断言和零宽度正预测先行断言。


10

如果您能容忍将两个空格连在一起作为一个字符串,那么您可以执行

String[] words = s.split("\\b");

然后words包含("hello", " ", "world")


2
+1 是因为在我的情况下,这也是可以接受的,因为我最终想要反转每个单词的字符,但保持单词顺序和相同的空格。 - Rock Lee
哦我的天啊 - 这让我整个一天都很开心。一直在努力拆分单词并保留它们之间的空格。有很多解决方法都没有百分之百地奏效 - 然后我看到了这个 - 一切都变得顺畅了! - slott
这是最好的!!+1 - Eiston Dsouza

4

s.split("((?<= )|(?= ))"); 是一种方法。

从技术上讲,这个正则表达式使用了前瞻和后顾。每个=后面的单个空格是分隔符。


1
你可以这样做:

List<String> result = new LinkedList<>();
int rangeStart = 0;
for (int i = 0; i < s.length(); ++i) {
  if (Character.isWhitespace(s.charAt(i))) {
    if (rangeStart < i) {
      result.add(s.substring(rangeStart, i));
    }
    result.add(Character.toString(s.charAt(i)));
    rangeStart = i + 1;
  }
}
if (rangeStart < s.length()) {
  result.add(s.substring(rangeStart));
}

是的,没有正则表达式,你可以起诉我。这样你就可以更容易地看到它的工作原理。


1
我测试过了,可以证明它是有效的。 - Rock Lee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接