繁体   English   中英

为什么字符串不拆分?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM