2017-01-09 50 views
0

我想从每行提取一个指定索引的子字符串。这里是字符串:每次遍历一个字符串&提取子字符串的指定索引

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位数字,即每次我循环字符串时,将引脚号作为子字符串。

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

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。

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

+1

什么约简单地通过空格和断行分裂? – SomeJavaGuy

+0

请在下次尝试正确格式化您的代码。 – TheLostMind

+0

使用带有字边界的正则表达式。检查一个*精确的* 12位数字前面加一个空格并使用'Pattern'和'Matcher'类 – TheLostMind

回答

0

正如其他人已经评论过的,如果你只是用空格分隔字符串,你可能会有更容易的时间。在这种情况下,我会分裂为\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位的批号之前(且仅由之前)。

如果你有不规则的数据,你的问题并不意味着,那么你可能不得不与匹配器。

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

上面一行是问题,当我值增加它会导致出界错误的,因为你会大于所限定字符串的索引。

更好的方法是进行循环,并通过分割空间和检查...

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

感谢AurA,我尝试着改正你的错误,但我得到一个不兼容的类型错误:字符串不能转换为int。 // [1] – Latz

+0

你可以对它进行字符串加我修正。 – AurA

0

I want extract the second 12-digit number, i.e. pin number as a substring everytime I loop through the string.

你甚至都不需要使用子方法。看到下面的例子:

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

嗨VHS,谢谢你的帮助。我很困惑,你的代码中的提取的引脚是子字符串。我确定num.length()== 12是一个布尔值。 – Latz

+0

@Latz,不客气。关于你的其他问题,'split'给你所有的空格分隔的数字。但是,您有两种类型的数字 - 一种是16位数字,另一种是12。后者是您的PIN码。 – VHS

0

是的,你可以尝试像@Kevin埃舍建议,请尝试拆分字符串基于空格。这应该对你有所帮助。

尝试用下面的代码片断:

对(INT I = 0;我< allPins.length();我++){

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

    System.out.println(test); 

}

+0

感谢Neelmani为此分享了一些信息,我按照你的说法做了,但是我仍然无法打印所有的子字符串。我想我在迭代到下一行时遇到了困难。 – Latz

0

分割字符串将是这是一个更好的方法。

尝试

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

More of white space splitting

现在你有一个字符串数组与您的批号和PIN码相邻。你可以通过遍历一个for循环访问它们。

还要记住要做的

string.equals("checking string") 

代替

string== string2 

检查平等。

0

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

对(INT I = 0;我< s1.length/2 -1;我++){

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

System.out.println(test); 

}

+0

谢谢ashwani,非常感谢。但结果只是打印所需子字符串总数的一半。 – Latz