Java - Как извлечь подстроку от начала до конца определенного слова в строке?

Строка ввода:

String sentence = "I am an Administrator of my building";

Желаемая выходная строка = "I am an Administrator"

Шаблон для извлечения подстроки: получить подстроку, начиная с начала строки «sentence» и до конца слова «Administrator».

Я мог бы получить endIndex «Администратора», а затем использовать substring(int beginIndex, int endIndex)

Не уверен, что это самый эффективный способ сделать это. Какой будет эффективный или короткий способ добиться этого?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
101
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Регулярное выражение на помощь:

String start = sentence.replaceAll("(?<=Administrator).*", "");

Это работает, сопоставляя все после Administrator и заменяя его ничем (фактически «удаляя» его).

Ключевой частью регулярного выражения является вид позади (?<=Administrator), который соответствует сразу после Administrator — между r и пробелом.

использовать метод подстроки бывший Строка s = "привет"

s.substring(0,2)

выход = он в вашем примере это будет

sentence.substring(0,21)

Это не очень полезно, потому что вы не объясняете, как выбрать 21 - если вы собираетесь иметь жестко закодированное значение, вы можете просто жестко закодировать "I am an Administrator", потому что, по крайней мере, вы можете легко увидеть, что это означает. Вы должны объяснить, как выбрать 21 во время выполнения.

Andy Turner 04.04.2023 22:28

indexOf то что нужно. Пытаться:

sentence.substring(0, sentence.indexOf(“Administrator”) + ”Administrator”.length())

(Кроме " вместо умных кавычек)

Andy Turner 04.04.2023 21:33

Вы можете использовать String#indexOf(str:String):int различными способами, чтобы эффективно захватывать части строки.

public class StringUtils {
    public static final String sentence = "I am an Administrator of my building";
    public static final String term = "Administrator";

    public static void main(String[] args) {
        // "I am an Administrator"
        System.out.println(headStringInclusive(sentence, term));

        // "Administrator of my building"
        System.out.println(tailStringInclusive(sentence, term));

        // "I am an "
        System.out.println(headStringExclusive(sentence, term));

        // " of my building"
        System.out.println(tailStringExclusive(sentence, term));
    }

    public static String headStringInclusive(String str, String term) {
        int index = str.indexOf(term);
        return index != -1 ? str.substring(0, index + term.length()) : str;
    }

    public static String tailStringInclusive(String str, String term) {
        int index = str.lastIndexOf(term);
        return index != -1 ? str.substring(index) : str;
    }

    public static String headStringExclusive(String str, String term) {
        int index = str.indexOf(term);
        return index != -1 ? str.substring(0, index) : str;
    }

    public static String tailStringExclusive(String str, String term) {
        int index = str.lastIndexOf(term);
        return index != -1 ? str.substring(index + term.length()) : str;
    }
}

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

String[][] sentences = {
        {"I am an Administrator of my building.", "Administrator"},
        {"I am a teacher of math students.", "teacher"},
        {"I am a parent of two children!!", "parent"}};

for(String[] info : sentences) {
    String result = trimAfterWord(info[0], info[1]);
    System.out.println(result);
}

отпечатки

I am an Administrator.
I am a teacher.
I am a parent!!
  • (?i) - сделать соответствие слова независимо от регистра. Существующий регистр слова будет сохранен в результате.
  • (.*?) - сделайте неохотное совпадение, чтобы обеспечить захват всех знаков препинания, если они существуют.
  • $ - сохраняйте знаки препинания только в конце предложения.
  • $1$2 - обратные ссылки на захваченные word и Punct
public static String trimAfterWord(String sentence, String word) {
    return sentence.replaceFirst("(?i)("+word+").*?(\\p{Punct}*)$", "$1$2");
}

Для получения дополнительной полезной информации о регулярных выражениях и сопоставлении шаблонов ознакомьтесь с Pattern.

Другие вопросы по теме