2013-10-30 65 views
1

虽然试图将一个字符串xyz213123kop234430099kpf4532分割成tokens:为什么字符串不分裂?

xyz213123 
kop234430099 
kpf4532 

我写了下面的代码,但的

String s = "xyz213123kop234430099kpf4532"; 
String regex = "/^[a-zA-z]+[0-9]+$/"; 
String tokens[] = s.split(regex); 
for(String t : tokens) { 
    System.out.println(t); 
} 

代替令牌,我得到整个字符串作为一个输出。 正则表达式我用过了什么?

+0

我不认为这可以用'split'和正则表达式来完成,因为'split'删除你搜索任何正则表达式的匹配;但你希望你的分裂根本没有任何消除。 –

回答

3

你可以这样做:

String s = "xyz213123kop234430099kpf4532"; 
String[] result = s.split("(?<=[0-9])(?=[a-z])"); 

的想法是使用零个宽度断言找到的地方,以绳剪断,然后我用一个回顾后(由数字[0-9]开头)和前瞻(后面跟一个字母[a-z])。

这些lookarounds只是检查和匹配什么都没有,因此split的分隔符是一个空字符串,并且没有字符从结果中删除。

+1

精彩的回答。我也学到了一些东西! :-) –

+0

啊,你打败了我! =) – hwnd

+0

@DavidWallace:谢谢。 –

1

由于表达式以^(字符串的开头)开始,并以$(字符串的结尾)结尾,因此字符串中没有与正则表达式匹配的内容。所以它要么匹配整个字符串,要么一无所有。但是因为它与字符串不匹配,所以在将字符串拆分为标记时找不到它。这就是为什么你只得到一个大牌。

+0

那显而易见!我想我误解了'regex'。这不是指'从字母开始到数字结束吗? – saplingPro

+0

这意味着有一些字母,然后有一些数字。但不是混合物。它必须是所有的字母,然后是所有的数字。 –

+0

如果是这样,为什么不分割字符串。 '正则表达式'只是告诉我想要字符串拆分的方式 – saplingPro

1

你不想使用splitsplit的参数是令牌之间的分隔符。你没有这个。相反,你有一个重复的模式,你希望每个匹配的模式。试试这个:

String s = "xyz213123kop234430099kpf4532"; 
Pattern p = Pattern.compile("([a-zA-z]+[0-9]+)"); 
Matcher m = p.matcher(s); 
while (m.find()) { 
    System.out.println(m.group()); 
} 

输出:

xyz213123
kop234430099
kpf4532

(我不知道由什么逻辑,你将有第二个令牌是“3kop234430099 “在你发布的问题中,我认为领先的”3“是一个错字。)

+0

这是一个错字。但是我没有让你不使用'split'方法。如果你可以更清楚地看到关于分割的文档说'把这个字符串分割成给定正则表达式的匹配。' – saplingPro

+0

假设你有一个字符串“123456789”。所以你可以把这个字符串'拆分'为正则表达式“4”的匹配,给出子字符串“123”和“56789”。 – Pines

+0

@Pines当我想到我创建的一个_delimiter_的正则表达式时,我也没有感觉到。 – saplingPro

2

你可以在数字和非数字之间进行匹配。

String s = "xyz213123kop234430099kpf4532"; 
String[] parts = s.split("(?<![^\\d])(?=\\D)"); 
for (String p : parts) { 
    System.out.println(p); 
} 

输出

xyz213123 
kop234430099 
kpf4532