2014-02-04 2 views
3

Предположим, у вас есть строка, как:Как получить (n) индекс символа внутри String?

String longStr="[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@someText14"; 

как получить индекс появления @ символа в строке выше?

Мне нужен индекс для разделения от этого индекса до конца.

+0

Зачем вам это нужно? Что вы пытаетесь сделать потом? – sp00m

+0

use string token –

ответ

4

String s=longStr.split("@")[9];

даст someText10

если вы хотите подстроку до конца

сделать

String sub=longStr.substring(indexOf(s)); 

или все в одном:

String sub=longStr.substring(indexOf(longStr.split("@")[9])); 
+3

+1, ОК, я не буду писать свой хромой ответ, который проходит через indexOf 10 раз –

+0

@The D Объединенный, см. Мое редактирование –

+0

Я не вижу, как будет работать ваше позднее редактирование ... Вы подстроки из индекса, который является длиной 10-го интервала между @s? Должна ли быть сумма длин первых 10 интервалов? – Amadan

5

Чтобы получить индекс «ручной» способ (без StringUtils):

pos = -1; 
for (int i = 0; i < 10; i++) { 
    pos = longStr.indexOf('@', pos + 1); 
} 

Чтобы получить остальную часть строки без индекса: используйте регулярное выражение. "(?:[^@]*@){10}(.*)" должен это сделать.

1

Попробуйте это:

String longStr="[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@someText14"; 
System.out.println(longStr.substring(longStr.indexOf(longStr.split("@")[10]))); 

Выход:

[email protected]@[email protected]@someText14 

Используйте следующий код, если вы хотите избежать ArrayIndexOutOfBoundsException, и вы не уверены, что если строка будет содержать в нем 10 @.

longStr.substring(longStr.indexOf(longStr.split("@")[Math.min(10,Math.max(longStr.lastIndexOf("@"),0))])) 
0

testString.split ("@", 11) [10]

Это вернет вам нужный результат. Метод split (String regex, int limit) - Этот метод разбивает строку с использованием регулярного выражения для количества предельных времен и возвращает массив.

Надеюсь, это решит вашу проблему.

1

Что об этом методе:

public static int indexOf(String haystack, String needle, int ordinal) { 
    try { 
     return haystack.length() - haystack.split(needle, ordinal + 1)[ordinal].length() - 1; 
    } catch (ArrayIndexOutOfBoundsException e) { 
     return -1; 
    } 
} 

и вызова, как:

String longStr="[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@someText14"; 
int idx = indexOf(longStr, "@", 10); 
System.out.println("Index of 10th occurrence: " + idx); 

Выведет 98.

0

Пожалуйста, попробуйте следующее:

public class StringUtils { 

public static int findIndexOfCharacter(String str, char ch, int num){ 
    if(str == null || str.equals("")){ 
     return -1; 
    } 

    if(num <= 0 || num >= str.length()){ 
     return -1; 
    } 

    if(!str.contains(String.valueOf(ch))){ 
     return -1; 
    }else{ 
     int[] indexOfCh = new int[str.length()]; 
     int index = 0; 
     String[] strArray = str.split(""); 
     for(int i = 1; i < str.length(); i++){ 
      if(strArray[i].charAt(0) == ch){ 
       indexOfCh[index] = i; 
       index++; 
      } 
     } 

     if(num > index){ 
      return -1; 
     } 
     return indexOfCh[num-1]; 
    } 


} 

}

JUnit Test:

@Test 
public void testFindIndexOfCharacter(){ 
    longStr = "[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@someText15"; 
    searchCh = '@'; 
    positionNum = 10; 
    assertEquals(101, StringUtils.findIndexOfCharacter(longStr, searchCh, positionNum)); 
} 
Смежные вопросы