1

这是一个字符串:

String s = "119 days 6 hours 13 minutes 24 seconds";

如何拆分以获得这样的数组:

{
  "119 days",
  "6 hours",
  "13 minutes",
  "24 seconds"
}

我不知道如何自己制作。

我寻找String.split()并尝试[a-z]\s了正则表达式,但它削减了最后一个字符

4

5 回答 5

4

对于这种特定情况,一种方法是使用否定的lookbehind进行拆分。

import java.util.Arrays;

class rTest {
  public static void main (String[] args) {
    String s = "119 days 6 hours 13 minutes 24 seconds";
    String[] parts = s.split("(?<![^a-zA-Z])\\s");
    System.out.println(Arrays.toString(parts));
  }
}

正则表达式:

(?<!           look behind to see if there is not:
 [^a-zA-Z]     any character except: 'a' to 'z', 'A' to 'Z'
)              end of look-behind
\s             whitespace (\n, \r, \t, \f, and " ")

输出

[119 days, 6 hours, 13 minutes, 24 seconds]
于 2013-10-26T00:05:53.127 回答
3

您走在正确的道路上,但是您需要使用零宽度匹配器组,以免它们被吞没,例如:

input.split(" (?=[0-9])");
于 2013-10-25T23:33:39.683 回答
2

您可以使用split零宽度环视,但我更愿意在合理的情况下避免环视。UsingMatcher使程序代码更加冗长,但它具有使正则表达式更易于理解的额外优势。由于大多数程序员比正则表达式更了解过程语言,这有时会导致代码更易于维护。

String s = "119 days 6 hours 13 minutes 24 seconds";
Pattern regex = Pattern.compile("\\w+ \\w+"); // match two words
Matcher matcher = regex.matcher(s);
ArrayList<String> list = new ArrayList<String>();
while (matcher.find()) {
    list.add(matcher.group());
}
System.out.println("list=" + list);
于 2013-10-26T00:05:32.787 回答
2

有两种解决方案可以解决您的问题,首先您可以简单地拆分字符串,
s.split(" ");但是这将返回每个单词并简化所有空格。
所以这两种解决方案是用空格分割并遍历数组并将每两个单词加在一起,中间有一个空格。
或者您可以更改输入字符串,以便您在除空格之外的其他内容上进行拆分,例如逗号(尽管这还涉及将字符串的来源编辑为新格式):

String s = "119 days, 6 hours, 13 minutes, 24 seconds";
String[] parts = s.split(", ");
于 2013-10-25T23:41:58.587 回答
2

您可以拆分每个后面有数字的空格。为此,您可以使用前瞻机制
(?=nextElement),因为split使用正则表达式。要表示正则表达式中的任何空格,您可以使用"\\s"and 表示任何 digit "\\d"

于 2013-10-25T23:33:48.933 回答