【问题标题】:Iterate through a string & extract substring for a specified index each time遍历一个字符串并每次提取指定索引的子字符串
【发布时间】:2017-01-09 06:11:21
【问题描述】:

我正在尝试从每个循环的行中提取指定索引的子字符串。这是字符串:

String allPins = "16101702000000 376627817243
              16101702000001 326520924472
              16101702000000 376627817243
              16101702000001 326520924472
              16101702000000 376627817243
              16101702000001 326520924472
              16101702000000 376627817243
              16101702000001 326520924472
              16101702000000 376627817243
              16101702000001 326520924472
              16101702000000 376627817243
              16101702000001 326520924472
              16101702000000 376627817243
              16101702000001 326520924472
              16101702000000 376627817243
              16101702000001 326520924472
              16101702000000 376627817243
              16101702000001 326520924472
              16101702000000 376627817243
              16101702000001 326520924472"; 

它不是字符串类型的数组。前 14 位数字是批号。我想在每次循环字符串时提取第二个 12 位数字,即 pin 号作为子字符串。

到目前为止,这是我的代码:

for (int i = 0; i < allPins.length();i++){

      String str = allPins.substring((28*i)+15,(28*i)+28);
      String test  = str;     

      System.out.println(test);  
}

//我得到一个 outOfBoundError。

//请帮助我如何最好地提取子字符串。

【问题讨论】:

  • 简单地用空格和换行符分割怎么样?
  • 请尝试从下次开始正确格式化您的代码。
  • 使用带有单词边界的正则表达式。检查恰好前面有空格的 12 位数字并使用 PatternMatcher

标签: java


【解决方案1】:

正如其他人已经评论的那样,如果您只是用空格分割字符串,您可能会更轻松。在这种情况下,我会拆分 \s+,表示一个或多个空格字符。

String[] parts = allPins[i].split("\\s+");
for (int i=1; i < parts.length; i=i+2) {     // iterate and print odds only
    System.out.println(parts[i]);
}

如果您知道您的数据格式正确,即每个 12 位 PIN 之前总是有一个 14 位批号(并且仅在其前面),那么这种方法应该没问题。

如果您有不规则的数据,而您的问题并未暗示,那么您可能需要使用匹配器。

【讨论】:

    【解决方案2】:

    我想提取第二个 12 位数字,即密码作为 每次循环遍历字符串时的子字符串。

    你甚至不需要使用 substring 方法。请参阅以下示例:

      for (String num: allPins.split(" ")) {
         if(num.length() == 12)
             System.out.println(num);
      }
    

    【讨论】:

    • 嗨 VHS,感谢您的帮助。我很困惑您的代码中提取的引脚作为子字符串的位置。我确定 num.length()==12 是一个布尔值。
    • @Latz,不客气。关于您的其他问题,split 为您提供了用空格分隔的所有数字。但是,您有两种类型的数字 - 一种长度为 16 位,另一种长度为 12。后者是您的密码。
    【解决方案3】:

    是的,您可以像@Kevin Esche 建议的那样尝试,请尝试根据空格拆分字符串。这应该对您有所帮助。

    试试下面的代码 sn-p:

    for (int i = 0; i

      String[] str = allPins.split("\\s");
      String test  = str[1];     
    
      System.out.println(test);  
    

    }

    【讨论】:

    • 感谢 Neelmani 分享了一些关于此问题的信息,我按照你说的做了,但我仍然无法打印所有子字符串。我认为我在迭代到下一行时遇到了困难。
    【解决方案4】:

    拆分字符串将是一种更好的方法。

    试试

    String[] strArr = allPins.split(" ");
    

    More of white space splitting

    现在您有一个字符串数组,其中包含您的批号和引脚号。您可以通过循环访问它们。

    还记得做

    string.equals("checking string")
    

    而不是

    string== string2
    

    检查相等性。

    【讨论】:

      【解决方案5】:

      String[] s1 = allPins.split(" "); System.out.println(s1.length);

      for (int i = 0; i

      String str = allPins.substring((28*i)+15,(28*i)+28);
      String test  = str;     
      
      System.out.println(test);  
      

      }

      【讨论】:

      • 谢谢阿什瓦尼,不胜感激。但结果只打印了所需子字符串总数的一半。
      【解决方案6】:
      String str = allPins.substring((28*i)+15,(28*i)+28);
      

      上面这行是问题所在,当 i 值增加时会导致超出范围的错误,因为你要超过字符串的定义索引。

      更好的方法是循环并按空格分隔并检查...

      String str = allPins.substring(allPins.split(" ")[1].toString());
      

      【讨论】:

      • 感谢 AurA,我尝试了您的更正,但我收到了不兼容的类型错误:字符串无法转换为 int。 //[1]
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多