Получить индекс энного возникновения строки?

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

99
задан DavidRR 12 January 2017 в 15:16
поделиться

3 ответа

Это в основном, что необходимо сделать - или по крайней мере, это - самое легкое решение. Все, что Вы "потратили бы впустую", является стоимостью n вызовов метода - Вы не будете на самом деле проверять случая дважды, если Вы будете думать об этом. (IndexOf возвратится, как только он находит соответствие, и Вы будете продолжать идти от того, где он кончил.)

52
ответ дан Jon Skeet 24 November 2019 в 05:03
поделиться

Вы действительно могли использовать регулярное выражение /((s).*?){n}/ для поиска энного возникновения подстроки s.

В C# это могло бы быть похожим на это:

public static class StringExtender
{
    public static int NthIndexOf(this string target, string value, int n)
    {
        Match m = Regex.Match(target, "((" + Regex.Escape(value) + ").*?){" + n + "}");

        if (m.Success)
            return m.Groups[2].Captures[n - 1].Index;
        else
            return -1;
    }
}

Примечание: я добавил Regex.Escape к исходному решению позволить искать символы, которые имеют особое значение к regex механизму.

104
ответ дан whyleee 24 November 2019 в 05:03
поделиться
private int IndexOfOccurence(string s, string match, int occurence)
{
    int i = 1;
    int index = 0;

    while (i <= occurence && (index = s.IndexOf(match, index + 1)) != -1)
    {
        if (i == occurence)
            return index;

        i++;
    }

    return -1;
}

или в C # с методами расширения

public static int IndexOfOccurence(this string s, string match, int occurence)
{
    int i = 1;
    int index = 0;

    while (i <= occurence && (index = s.IndexOf(match, index + 1)) != -1)
    {
        if (i == occurence)
            return index;

        i++;
    }

    return -1;
}
14
ответ дан 24 November 2019 в 05:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: