尝试将字符串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);
}
但是代替令牌,我将整个字符串作为一个输出。我使用的正则表达式出了什么问题?
答案 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)
您不希望使用split
。 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”是一个错字。)