【问题标题】:Get from String the first value with random digits从字符串中获取随机数字的第一个值
【发布时间】:2014-12-25 00:24:56
【问题描述】:

在我的应用程序中,我收到这样的字符串:

String1 = "[6, I.3, Contaminación Mecánica, 0.0, 0.0, 0.0, 196.875, 0.0, 196.875]";
String2 = "[16, E.19, Errores de los usuarios, 0.0, 0.0, 3281.25, 0.0, 0.0, 3281.25]";

从这个字符串中,我只需要第一个值(来自 String1 和 String2)。这已经解决了,使用这段代码可以获得前两位数字:

    String Amenaza = InformeAmenazasAGR.get(i).toString();
    Amenaza = Amenaza.substring(1,3);
    Amenaza = Amenaza.replace(",","");

现在我也可以收到这个字符串了

 String3 = "[39854, R.01, Robo Outdoor, 0.0, 84000.0, 24500.0, 24500.0, 0.0, 133000.0]";

我尝试使用

    String Amenaza = InformeAmenazasAGR.get(i).toString();
    Amenaza = Amenaza.substring(1,6);
    Amenaza = Amenaza.replace(",","");

但当第一个值只有 1 位时,获取第二个值的 chars 并且此代码可以超过 5 位。如果有随机位数,我如何才能只获得第一个值?。

提前谢谢你。

【问题讨论】:

    标签: java string replace substring


    【解决方案1】:

    使用 substring/indexOf(如果你问我,首选方式)

    String firstNumber = string1.substring(1, s1.indexOf(','));
    

    第一个参数 (1) 确保不包含 [ 字符,第二个参数是第一个 , 字符的索引。

    使用正则表达式(如果您想将其概括为包含其他数字,则很有用

    Pattern p = Pattern.compile("\\[(\\d+),");
    Matcher m = p.matcher(s1);
    m.find();
    System.out.println(m.group(1));
    

    请注意,模式对象可以重复用于多个数字提取。

    关于split的一点警告: 看起来字符串很长,您只对其中的一小部分感兴趣。 split 所做的是它返回原始字符串的视图,因此您的程序仍然保留大字符串。如果对大量字符串执行此操作,可能会遇到内存不必要的内存问题。

    【讨论】:

    • +1 这种方法比需要遍历整行的split 更简单、更轻巧。我唯一建议的是添加引用,它将保存来自substring 的结果,因为现在看起来substring 我们正在操纵string1 值,而实际上我们正在创建新字符串。
    • 谢谢,我用了这个方法。我需要管理大量字符串,所以我试图在任何时候逃避split
    【解决方案2】:

    使用正则表达式来查找您的第一个数字序列。

    例如:

    String[] input = { 
        "[6, I.3, Contaminación Mecánica, 0.0, 0.0, 0.0, 196.875, 0.0, 196.875]",
        "[16, E.19, Errores de los usuarios, 0.0, 0.0, 3281.25, 0.0, 0.0, 3281.25]",
        "[39854, R.01, Robo Outdoor, 0.0, 84000.0, 24500.0, 24500.0, 0.0, 133000.0]"
    };
    //                            | preceded by start of input and open square bracket
    //                            |       | digit sequence of any length (1+ characters)
    Pattern p = Pattern.compile("(?<=^\\[)\\d+");
    // iterating various inputs
    for (String s: input) {
        // matching
        Matcher m = p.matcher(s);
        if (m.find()) {
            // printing out match
            System.out.println(m.group());
        }
    
    }
    

    输出

    6
    16
    39854
    

    【讨论】:

      【解决方案3】:

      试试这个:

      String String1 = "[645245, I.3, Contaminación Mecánica, 0.0, 0.0, 0.0, 196.875, 0.0, 196.875]";
      String[] splitdata = String1.split(",");    
      System.out.println(splitdata[0].replaceAll("[^a-zA-Z0-9., ]", ""));
      

      希望对你有所帮助。

      【讨论】:

        【解决方案4】:

        您可以拆分字符串并获取第一个元素。不要忘记删除[ 字符:

        String String1 = "[6214, I.3, Contaminación Mecánica, 0.0, 0.0, 0.0, 196.875, 0.0, 196.875]";
        
        String[] split = String1.split(",");
        System.out.println(split[0].replace("[", ""));
        

        这种方法很清楚并且自我解释(给我输入字符串的第一个元素),当您想要保留对拆分字符串的引用以进行进一步访问时,它非常有用。如果你只关心获取第一个元素,我也建议使用 substring 方法:

        String firstElem = String1.subString(1 , String1.indexOf(','));
        

        除非您处理许多字符串(超过几百万),否则您不应该考虑内存消耗。

        【讨论】:

          猜你喜欢
          • 2011-02-18
          • 2015-02-08
          • 1970-01-01
          • 1970-01-01
          • 2012-06-09
          • 2018-07-11
          • 2015-05-21
          相关资源
          最近更新 更多