【问题标题】:Java: string split by regexp to get only integersJava:通过正则表达式拆分字符串以仅获取整数
【发布时间】:2014-03-04 11:41:03
【问题描述】:

我有一个字符串:[1, 2, 3, 4]。我只需要获取整数1 2 3 4

我尝试了以下拆分:

str.split(",");
str.split("\\D\\s");

两个拆分都返回四个元素:[1 2 3 4],但我不需要这些括号 [ ]。拆分正则表达式有什么问题?

更新

我不得不提到,每个数字都用[ ] 包裹的情况可能会发生。

【问题讨论】:

  • substring 首先。然后split
  • @MustafaGenç,如果每个整数都用[] 包裹怎么办?
  • 试试 yourString = yourString.replace ( /[^\d.]/g, '' );

标签: java string split


【解决方案1】:

您可以尝试先过滤掉不需要的元素,然后再拆分:

String filtered = str.replaceAll("[^0-9,]","");
String[] numbers = filtered.split(",");

【讨论】:

  • 哦,真的,我怎么会错过replaceAll。谢谢,这就是我试图做的。
  • 这是可能的,但不允许轻易更改分隔符,例如 [1][2],[3] 这样的来源会遇到问题
  • 就我们所知,[0 1,2] 的期望输出也可能是01 2。 OP没有提到的一切都是猜测。
【解决方案2】:

您的代码完全按照您所说的做:使用“,”作为分隔符分割字符串:

"[1, 2, 3]" => "[1" , " 2", " 3]"

可以在使用split() 之前将字符串按摩成形状 - 删除空格和方括号。然而,更直接的正则表达式方法是使用 Matcher 扫描输入字符串:

    Pattern pattern = Pattern.compile("(\\d+)\\D+");
    ArrayList<String> list = new ArrayList<String>();
    Matcher matcher = pattern.matcher(input);
    while(matcher.find()) {
        list.add(matcher.group(1));
    }
    // if you really need an array
    String[] array = list.toArray(new String[0]);

此模式(\d+)\D+ 匹配一个或多个数字,后跟一个或多个非数字,它捕获组中的数字,您可以使用matcher.group(1) 访问该组。它与您的输入非常松散地匹配;如果你愿意,你可以让它更具体(这样它会拒绝其他形式的输入)。

【讨论】:

    【解决方案3】:

    实际上split函数返回一个字符串数组,这就是你得到这个[]的原因。

    使用替换方法来做到这一点。

    【讨论】:

      【解决方案4】:

      试试这个:

      String str = "[1, 2, 3, 4]";
      String num = str.replaceAll( "[^\\d,]", "" );
      

      你会得到字符串1,2,3,4

      然后使用String[] allNums = num.split(",");

      编辑:这也适用于输入 String str = "[[1], [2], [3], [4]]";

      【讨论】:

        【解决方案5】:

        您提供给 split 方法的正则表达式用于确定每个拆分的索引。

        处理您的情况的最简洁的解决方案是使用Pattern.compile 创建一个类似[0-9]+ 的模式,然后使用匹配器查找源字符串中的每个匹配项。

        代码示例:

        Pattern pattern = Pattern.compile("[0-9]+");
        Matcher matcher = pattern.matcher(yourString);
        
        while(matcher.find()) {
            System.out.println(matcher.group());
        }
        

        这会打印出yourString 中的每个连续数字。


        附录:如果您经常使用这段代码,请创建一个静态变量,在加载类时已经编译 Pattern,因为模式编译很昂贵。点赞:private static final Pattern NUMBER_PATTERN = Pattern.compile("[0-9]+");

        【讨论】:

          【解决方案6】:
          String s=s.substring(1,s.length()-1);
          String s1[]=s.split(",");
          

          这将为您提供预期的字符串。

          【讨论】:

          • 如果每个整数都用 [] 包裹,这是行不通的。
          • @Dragon 这种情况是可能的,那么您应该在问题中提到它。
          【解决方案7】:

          尝试对代码执行此操作:

          yourString = yourString.replace ( /[^\d.]/g, '' );
          

          【讨论】:

            【解决方案8】:

            替换括号[ ]然后拆分

            str.replaceAll("\\[", "").replaceAll("\\]", "").split(",");
            

            【讨论】:

            • 而不是"\\[",最好使用原始字符串:r"\["
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-10-16
            • 1970-01-01
            • 2018-06-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多