【问题标题】:Splitting a String into several Strings in Java在 Java 中将一个字符串拆分为多个字符串
【发布时间】:2013-05-28 06:17:29
【问题描述】:

我将如何在出现某个字符的几个地方拆分字符串。

例如,这里是字符串

“10067829311288”

在遍历String时,如果数字是“1”,则取后面的两个字符并拆分,如果不是,则只取一个。这是应该如何拆分的。

100 67 82 93 112 88

感谢任何帮助。

【问题讨论】:

  • 为什么双1的结果是112而不是1128

标签: java string split substring


【解决方案1】:

这样的事情怎么样:

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?\\d{2}”的作用吗?
  • 正则表达式 1?\\d{2} 匹配可选的 1 贪婪地后跟两位数字。因此,如果没有 1,它将抓取两位数,如果有 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;
}

更新:在看到蜘蛛鲍里斯如何做他的正则表达式后简化了我的正则表达式。

【讨论】:

  • 谢谢,我猜 \\d{2} 和 \\d\\d 是一样的?
【解决方案3】:

你可以试试这个方法

"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 表示最后一个匹配(拆分)的位置,如果第一个匹配不存在,则表示字符串的开始。

(?&lt;=regex)look-behind 机制

\\d代表数字

| 是或

【讨论】:

    猜你喜欢
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多