我将如何在出现某个字符的几个地方拆分字符串。
例如,这里是字符串
“10067829311288”
循环遍历String时,如果数字是“1”,则取下两个字符并拆分,如果不是,则只取一个。这是应该如何拆分的。
100 67 82 93 112 88
任何帮助表示赞赏。
像这样的东西怎么样:
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);
}
这是一种可能的解决方案。
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;
}
更新:在看到蜘蛛鲍里斯如何做他的正则表达式后简化了我的正则表达式。
你可以试试这个方法
"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)
是后视机制
\\d
代表数字
|
是或