如何在一些特定角色出现的地方拆分String。
例如,这是String
“10067829311288”
当循环遍历字符串时,如果数字是“1”,则接下来的两个字符将被分割,如果不是,则只需要一个。这是它应该如何拆分。
100 67 82 93 112 88
感谢任何帮助。
答案 0 :(得分:3)
这样的事情怎么样:
public static void main(String[] args) {
final String s = "10067829311288";
final List<Integer> split = new LinkedList<>();
int i = 0;
while (i < s.length()) {
final char c = s.charAt(i);
final int remain = s.length() - i;
final int step;
if (c == '1') {
step = Math.min(remain, 3);
} else {
step = Math.min(remain, 2);
}
split.add(Integer.parseInt(s.substring(i, i + step)));
i += step;
}
System.out.println(split);
}
或者,使用正则表达式:
public static void main(String[] args) {
final String s = "10067829311288";
final List<Integer> split = new LinkedList<>();
final Pattern pattern = Pattern.compile("1?\\d{2}");
final Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
split.add(Integer.parseInt(matcher.group()));
}
System.out.println(split);
}
答案 1 :(得分:2)
这是一种可能的解决方案。
public void split() {
System.out.println(split("10067829311288"));
}
public List<String> split(String text) {
List<String> result = new LinkedList<>();
Matcher m = Pattern.compile("1?\\d\\d").matcher(text);
while (m.find()) {
result.add(m.group());
}
return result;
}
更新:在看到蜘蛛鲍里斯如何做他的正则表达式之后简化了我的正则表达式。
答案 2 :(得分:0)
你可以试试这种方式
"10067829311288".split("(?<=\\G(1\\d\\d|[02-9]\\d))");
演示
System.out.println(Arrays.toString("10067829311288".split("(?<=\\G(1\\d\\d|[02-9]\\d))")));
输出:[100, 67, 82, 93, 112, 88]
\\G
表示最后一次匹配(拆分)的位置,如果第一次匹配不存在,则表示字符串的开头。
(?<=regex)
是look-behind机制
\\d
代表数字
|
是OR