![](/img/trans.png)
[英]Why split method does not support $,* etc delimiter to split string
[英]Why the string does not split?
尝试将字符串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);
}
但是我没有令牌,而是将整个字符串作为一个输出。 我使用的正则表达式有什么问题?
您可以这样做:
String s = "xyz213123kop234430099kpf4532";
String[] result = s.split("(?<=[0-9])(?=[a-z])");
这个想法是使用零宽度断言来找到剪切字符串的位置,然后我使用向后查找(前跟数字[0-9]
)和向前查找(后跟字母[az]
)。
这些环视仅是检查,不匹配任何内容,因此拆分的定界符为空字符串,并且不会从结果中删除任何字符。
您可以在数字和非数字之间进行这种匹配。
String s = "xyz213123kop234430099kpf4532";
String[] parts = s.split("(?<![^\\d])(?=\\D)");
for (String p : parts) {
System.out.println(p);
}
输出量
xyz213123
kop234430099
kpf4532
字符串中没有与正则表达式匹配的内容,因为您的表达式以^(字符串的开头)开头,以$(字符串的结尾)结尾。 因此它要么匹配整个字符串,要么完全不匹配。 但是因为它与字符串不匹配,所以在将字符串拆分为标记时找不到它。 这就是为什么您只获得一个大令牌的原因。
您不想为此使用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”是一个错字。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.