найти n-й вхождение подстроки в строке в Java? - PullRequest
5 голосов
/ 15 апреля 2011

У меня есть строка, которая является полным содержимым HTML-страницы, и я пытаюсь найти индекс 2-го вхождения </table>. У кого-нибудь есть предложения, как этого добиться?

Ответы [ 5 ]

7 голосов
/ 16 января 2013

Обобщение @ ответа BasVanDenBroek , используя indexOf:

public static int nthIndexOf(String source, String sought, int n) {
    int index = source.indexOf(sought);
    if (index == -1) return -1;

    for (int i = 1; i < n; i++) {
        index = source.indexOf(sought, index + 1);
        if (index == -1) return -1;
    }
    return index;
}

Быстрый и грязный тест:

public static void main(String[] args) throws InterruptedException {
    System.out.println(nthIndexOf("abc abc abc", "abc", 1));
    System.out.println(nthIndexOf("abc abc abc", "abc", 2));
    System.out.println(nthIndexOf("abcabcabc", "abc", 2));
    System.out.println(nthIndexOf("abcabcabc", "abc", 3));
    System.out.println(nthIndexOf("abc abc abc", "abc", 3));
    System.out.println(nthIndexOf("abc abc defasabc", "abc", 3));
    System.out.println(nthIndexOf("abc abc defasabc", "abc", 4));
}
6 голосов
/ 15 апреля 2011

Вот выстрел для удовольствия;)

public static int findNthIndexOf (String str, String needle, int occurence)
            throws IndexOutOfBoundsException {
    int index = -1;
    Pattern p = Pattern.compile(needle, Pattern.MULTILINE);
    Matcher m = p.matcher(str);
    while(m.find()) {
        if (--occurence == 0) {
            index = m.start();
            break;
        }
    }
    if (index < 0) throw new IndexOutOfBoundsException();
    return index;
}
5 голосов
/ 01 августа 2012

Другим хорошим вариантом для нахождения N-го вхождения строки является использование StringUtils.ordinalIndexOf () от Apache Commons:

StringUtils.ordinalIndexOf("aabaabaa", "b", 2)  == 5
4 голосов
/ 15 апреля 2011

Сначала найдите первый индекс, затем найдите второй индекс, начиная поиск с первого индекса + 1

String string = "first</table>second</table>";
int firstIndex = string.indexOf("</table>");
int secondIndex = string.indexOf("</table>", firstIndex+1);
System.out.println("second index: " + secondIndex);

Между прочим, это довольно простой код, вам нужно создать дополнительные проверки (index! = -1 и т. П.) Также в заголовке вашего поста сказано n-й случай, но в вашем посте вы упомянули конкретно второй случай. Я уверен, что вы сможете понять это отсюда, если вам действительно нужен n-й случай.

0 голосов
/ 17 ноября 2015

Продолжаем работать над https://stackoverflow.com/a/5678546/15789 и https://stackoverflow.com/a/14356988/15789 (благодаря оригинальным постерам @ sebastiaan-van-den-broek и @assylias).

Получить все индексы в массиве. Тогда вы можете получить любой n-й индекс. Во многих случаях может потребоваться получить n-й индекс подстроки в строке несколько раз. Получить массив один раз и получить доступ к нему несколько раз может быть проще.

public static int[] getIndices(String source, String substr) {
    List<Integer> indicesList = null;
    int index = source.indexOf(substr);
    if (index == -1) {
        return new int[0];
    } else {
        indicesList = new ArrayList<>();
        indicesList.add(index);
    }

    while (index != -1) {
        index = source.indexOf(substr, index + 1);
        if (index != -1) {
            indicesList.add(index);
        }
    }

    // Integer[] iarr = new int[1]; 
    //Autoboxing does not work with arrays. Run loop to convert. 
    //toArray does not convert Integer[] to int[]
    int[] indices = new int[indicesList.size()];
    for (int i = 0; i < indicesList.size(); i++) {
        indices[i] = indicesList.get(i);
    }
    return indices;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...