1

在尝试将字符串拆分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

4 回答 4

3

你可以这样做:

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

这个想法是使用零宽度断言来找到剪切字符串的位置,然后我使用后向(前面是 digit [0-9])和前瞻(后跟一个字母[a-z])。

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

于 2013-10-30T02:13:19.190 回答
2

您可以在数字和非数字之间进行这种匹配。

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

输出

xyz213123
kop234430099
kpf4532
于 2013-10-30T02:17:16.333 回答
1

您的字符串中没有任何内容与正则表达式匹配,因为您的表达式以 ^(字符串开头)开头并以 $(字​​符串结尾)结尾。所以它要么匹配整个字符串,要么什么都不匹配。但是因为和字符串不匹配,所以在将字符串拆分成token的时候是找不到的。这就是为什么你只得到一个大令牌的原因。

于 2013-10-30T01:45:34.630 回答
1

你不想用split它。to 的参数split是标记之间的分隔符。你没有那个。相反,您有一个重复的模式,并且您希望每个匹配都与该模式匹配。试试这个:

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”是一个错字。)

于 2013-10-30T01:51:27.507 回答