Лучший способ извлечь некоторые строки из строки

Есть ли лучший способ извлечь подстроку из строки?

Я хочу извлечь символы, окруженные "и" в строке. Я использовал методы substring() и indexOf(), но я уверен, что есть лучший способ.

Например, для этого ввода:

I "learn" java "and" python.

Желаемый результат:

learn

and

Вот что я пробовал:

public static void main(String[] args) {
    Scanner putIn = new Scanner(System.in);
    String input = putIn.nextLine();
    String subInput = input.substring(input.indexOf("\"") + 1);
    System.out.println(subInput);
    String strOne= subInput.substring(0, subInput.indexOf("\""));
    System.out.println(strOne);
    String strTwo = subInput.substring(strOne.length() + 4, subInput.length() - 2);
    System.out.println(strTwo);
}

Вы действительно не делаете никакого «извлечения» здесь. Какова ваша цель с этим кодом?

Hovercraft Full Of Eels 30.05.2019 02:14

Извлеките две подстроки, окруженные " и ".

Reza Mazaheri 30.05.2019 02:15

Вместо того, чтобы повторять то, что вы уже опубликовали, рассмотрите возможность объяснения деталей. Ваш вывод просто повторяет вторую строку в вызове «метода».

Hovercraft Full Of Eels 30.05.2019 02:16

Ввод программы - это одна строка (которая должна содержать слово, окруженное "и"), например: Dreams "держать" меня "живым" эта программа должна напечатать две строки, которые: keep и live.

Reza Mazaheri 30.05.2019 02:20

Можно ли экранировать кавычки, как Tom:"What movie do you like?". Emmy:"I like \"Titanic\""? Что должно совпадать в этом случае? Есть ли другие случаи, о которых мы должны знать?

Pshemo 30.05.2019 02:22

любая строка во входных данных, заключенная в кавычки, например: мне нравится «учиться» и «плавать». strOne должен учиться, а strTwo должен плавать.

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

Ответы 2

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

https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

Для конкретного регулярного выражения, которое вы хотите извлечь между кавычками, вы можете обратиться к обсуждению здесь:

RegEx: захват значений между кавычками

Решение с регулярным выражением приятно, потому что вы можете легко обобщить его за пределы вашего текущего варианта использования.

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

Pattern и Matcher классы, кажется, соответствуют вашим потребностям:

Pattern pattern = Pattern.compile("\"([a-zA-Z]*)\"");
Matcher matcher = pattern.matcher(input);

while(matcher.find()) {
    System.out.println(matcher.group(1));
}

Дальнейшее объяснение:

  • Pattern pattern = Pattern.compile("\"([a-zA-Z]*)\""); -> Создать Pattern, который соответствует буквам между символами кавычек
  • Matcher matcher = pattern.matcher(input); -> Создайте Matcher, чтобы связать Pattern и пользовательский ввод.
  • while(matcher.find()) пока есть совпадения... Конечно можно добавить совпавшие строки в массив, здесь я их просто печатаю.

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