Подобно опубликованному вопросу здесь , я ищу решение на Java.
То есть, как найти индекс n-го вхождения символа / строки из строки?
Пример: « / folder1 / folder2 / folder3 / ». В этом случае, если я прошу 3-е появление косой черты (/), она появится перед папкой 3, и я ожидаю вернуть эту позицию индекса. Мое фактическое намерение состоит в том, чтобы подставить его из n-го вхождения символа.
Есть ли какой-либо удобный / готовый к использованию метод, доступный в Java API, или нам нужно написать небольшую логику самостоятельно, чтобы решить эту проблему?
Также,
- Я быстро поискал, поддерживается ли какой-либо метод для этой цели в StringUtils Apache Commons Lang , но не нашел.
- Могут ли в этом помочь регулярные выражения?
Ответы:
Если ваш проект уже зависит от Apache Commons, вы можете использовать его
StringUtils.ordinalIndexOf
, в противном случае вот реализация:Это сообщение было переписано как статья здесь .
источник
lastIndexOf
.Я считаю, что самым простым решением для поиска N-го вхождения строки является использование StringUtils.ordinalIndexOf () из Apache Commons.
Пример:
источник
Возможны два простых варианта:
charAt()
повторноindexOf()
повторноНапример:
Это может не работать так хорошо, как
indexOf
многократное использование , но, возможно, проще сделать правильно.источник
Вы можете попробовать что-то вроде этого:
Обратите внимание, что я сделал некоторые предположения в регулярном выражении:
В соответствии с просьбой в комментарии, я попытаюсь объяснить регулярное выражение:
(/[^/]*){2}/([^/]*)
/[^/]*
за/
которым следует[^/]*
(любое количество символов, кроме a/
),(/[^/]*)
группирует предыдущее выражение в единый объект. Это1
первая группа выражения,(/[^/]*){2}
означает, что группа должна точно совпадать по{2}
времени,[^/]*
снова любое количество символов, которые не являются/
,([^/]*)
группирует предыдущее выражение в единый объект. Это2
ая группа выражения.Таким образом, вам нужно только получить подстроку, соответствующую 2-й группе:
return m.group(2);
Изображение предоставлено Debuggex
источник
Я внес несколько изменений в ответ aioobe, получил n-ю версию lastIndexOf и исправил некоторые проблемы с NPE. Смотрите код ниже:
источник
null
качестве аргумента. Это наиболее распространенное поведение в стандартной библиотеке.Сопоставьте все, за чем следует / два раза, а затем еще раз. Третий - тот, который тебе нужен
Состояние Matcher можно использовать, чтобы определить, где находится последний /
источник
источник
В настоящее время ЕСТЬ поддержка StringUtils Apache Commons Lang ,
Это примитив:
для вашей проблемы вы можете закодировать следующее:
StringUtils.ordinalIndexOf(uri, "/", 3)
Вы также можете найти последнее n-е вхождение символа в строке с помощью метода lastOrdinalIndexOf .
источник
Возможно, вы могли бы добиться этого и с помощью метода String.split (..).
источник
Другой подход:
источник
Этот ответ улучшает ответ @aioobe. В этом ответе исправлены две ошибки.
1. n = 0 должен вернуть -1.
2. n-е вхождение вернуло -1, но оно работало в n-1-м вхождениях.
Попробуй это !
источник
источник
источник
Мое решение:
источник
Код возвращает подстроку n-го вхождения позиций, также известную как ширина поля. Пример. Если строка «Stack overflow in low melow» - это строка для поиска 2-го появления токена «low», вы согласитесь со мной, что это 2-е появление находится в подстроке «18 и 21» . indexOfOccurance («Переполнение стека при низком уровне», low, 2) возвращает 18 и 21 в строке.
источник
источник
// scala
// выбрасываем -1, если значение отсутствует в n-й раз, даже если оно присутствует до n-1-го раза. // бросаем индекс, если значение присутствует в n-й раз
источник