为什么字符串不分裂?

时间:2013-10-30 01:42:27

标签: java regex

尝试将字符串xyz213123kop234430099kpf4532拆分为标记时:

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

但是代替令牌,我将整个字符串作为一个输出。我使用的正则表达式出了什么问题?

4 个答案:

答案 0 :(得分:3)

你可以这样做:

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

我的想法是使用零宽度断言找到切割字符串的位置,然后使用lookbehind(前面有数字[0-9])和前瞻(后跟字母[a-z] )。

这些外观只是检查并且不匹配,因此拆分的分隔符是空字符串,并且不会从结果中删除任何字符。

答案 1 :(得分:2)

您可以拆分数字和非数字之间的匹配。

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

输出

xyz213123
kop234430099
kpf4532

答案 2 :(得分:1)

你的字符串中没有任何东西与正则表达式匹配,因为你的表达式以^开头(字符串的开头)并以$结尾(字符串的结尾)。所以它要么匹配整个字符串,要么根本没有。但是因为它与字符串不匹配,所以在将字符串拆分为标记时找不到它。这就是为什么你只得到一个重要的标记。

答案 3 :(得分: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”是一个错字。)