2013-10-25 110 views
1

这里是一个字符串:分割字符串,Java的

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

如何做出让阵列像这样分割:

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

我不知道如何使它自己。

我看了String.split()并试图[a-z]\s正则表达式,但它减少的最后一个字符

+0

如果您想尝试用空格分割字符串,你发现'String.split',你尝试'字符串。 split(“”)'或'string.split(“\\ s”)'? – Nivas

+0

@Nivas,不,不是空间。我需要分解成单词'n文本的组合 – ovnia

回答

4

的一种方法,采用了负反向预搜索分裂。

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] 
3

你是在正确的道路,但你需要使用zero-width匹配组,以使它们不会吞噬,所以像:

input.split(" (?=[0-9])"); 
2

您可以在每个后面有数字的空格上拆分。要做到这一点,你可以使用look ahead机制
(?=nextElement)因为split使用正则表达式。要在正则表达式中表示任何空格,您可以使用"\\s"并表示任何数字"\\d"

2

这两个解决方案,你想要什么,首先,你可以简单地分割字符串
s.split(" ");然而,这将返回每个单词和缓解所有的空间。
所以这两个解决方案将是空间分割,并通过数组并添加每两个单词与中间的空间。
或者你可以改变输入字符串,所以你在比其他空间分割的东西,如逗号(尽管这也将涉及编辑在串从进入新的格式来):

String s = "119 days, 6 hours, 13 minutes, 24 seconds"; 
String[] parts = s.split(", "); 
2

你可以使用split与零宽度的周边,但我更喜欢避免环视时,这是合理的。使用Matcher可使程序代码更加冗长,但它还具有使正则表达式更易于理解的优点。由于大多数程序员都比正则表达式更好地理解过程语言,所以这有时会产生更多可维护的代码。对于这种特殊情况下

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);