【问题标题】:How to extract all integers from a string and store them in an int array in java如何从字符串中提取所有整数并将它们存储在java中的int数组中
【发布时间】:2021-12-12 06:00:21
【问题描述】:

我想获取一个字符串并将其中的所有整数隔离,然后将它们存储在一个数组中。

输入字符串只会包含字母 a-z(大写和小写)、数字 0-9 和“-”(读作减号)。

到目前为止,我已经写了:

String str = readString();

String[] arr = str.split("[^0-9-]+");

如果我的输入字符串是例如“15abc-59abc31abc100”,上面的代码可以正常工作,我只需要将字符串数组中的每个元素转换为 int,但是如果我的输入字符串在数字之间没有字母来分隔它们将无法正常工作。示例:abc59-12abc56-10abc10 将生成一个只有 3 个元素的数组:59-12、56-10、10 如何让它将减号识别为数组中新元素的开始,而不会丢失符号本身?

理想情况下,我希望输入“abc59-12abc56-10abc10”在拆分后看起来像这样:

String[] arr = {"59","-12","56","-10","10");

readString();方法将始终提供我上面描述的字符串类型。

【问题讨论】:

    标签: java string split type-conversion integer


    【解决方案1】:

    这是一个单行:剥离前导和尾随非数字,然后拆分为非数字/减号,转换为int,然后收集到一个数组:

    int[] numbers = Arrays.stream(str.replaceAll("^\\D+|\\D+$", "").split("(?=-\\d)|[^-\\d]+"))
      .mapToInt(Integer::parseInt).toArray();
    

    这里的关键是拆分,当后面的字符是减号然后是数字,既不是减号也不是数字的字符时,它会进行零宽度吐出。

    【讨论】:

      【解决方案2】:

      您真正想要的是- 一个有效的“数字符号”,但在任何给定数字块的开头。

      但是,通过尝试匹配它们之间的负空间,您让自己很难:就正则表达式而言,这很棘手。

      但是,如果你走的是积极路线(写一个描述 一个数字的正则表达式),那将是微不足道的:Pattern.compile("-?\\d+") 完美地描述了它:一个可选的减号后跟 1 或更多位数。很简单。如果您的输入是“aa----5”,它甚至会“起作用”,它有一个匹配序列 (-5)。

      那么..那么就这样做吧。你在这里滥用split。不要滥用系统,一旦你让事情变得更复杂一点,它往往会变得很糟糕。

      private static final Pattern NUMBER = Pattern.compile("-?\\d+");
      
      public List<Integer> getNumbers(String in) {
        Matcher m = NUMBER.matcher(in);
        var out = new ArrayList<Integer>();
        while (m.find()) out.add(Integer.parseInt(m.group(0)));
        return out;
      }
      

      这里使用了一些技巧:

      • m.find() 在输入字符串中查找与提供的正则表达式匹配的下一个子序列。
      • 默认情况下,正则表达式是“贪婪的”。意思是,字符串“1234”可以通过多种方式合法地解释:这是单个项目(1234)吗?毕竟,只是'1'也匹配“-?\ d +”。 “贪婪”意味着正则表达式将匹配最长的序列。毫无疑问,这正是您想要的。
      • m.group(0) 让你匹配。 0 是包含整个找到的序列的特殊组。如果您在正则表达式中使用括号,则可以创建组,并且您也可以获得这些组,例如如果你想排除减号,你可以做"-?(\\d+)" - 注意括号。现在你可以m.group(1)
      • 请注意,如果您必须有int[],则将整数列表转换为int[] 需要循环。 toArray 做不到(Integer 不是 int,但 List&lt;int&gt; 目前是非法的 java)。

      【讨论】:

      • 谢谢你的回答,问题解决了:)
      猜你喜欢
      • 1970-01-01
      • 2018-01-01
      • 1970-01-01
      • 2012-09-29
      • 1970-01-01
      • 2020-02-07
      • 2020-12-08
      • 2018-07-30
      • 1970-01-01
      相关资源
      最近更新 更多