Есть ли лучший способ извлечь подстроку из строки?
Я хочу извлечь символы, окруженные "и" в строке. Я использовал методы 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);
}
Извлеките две подстроки, окруженные " и ".
Вместо того, чтобы повторять то, что вы уже опубликовали, рассмотрите возможность объяснения деталей. Ваш вывод просто повторяет вторую строку в вызове «метода».
Ввод программы - это одна строка (которая должна содержать слово, окруженное "и"), например: Dreams "держать" меня "живым" эта программа должна напечатать две строки, которые: keep и live.
Можно ли экранировать кавычки, как Tom:"What movie do you like?". Emmy:"I like \"Titanic\""
? Что должно совпадать в этом случае? Есть ли другие случаи, о которых мы должны знать?
любая строка во входных данных, заключенная в кавычки, например: мне нравится «учиться» и «плавать». strOne должен учиться, а strTwo должен плавать.
Я думаю, что регулярные выражения идеально подходят для вашего дела. С помощью класса 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())
пока есть совпадения... Конечно можно добавить совпавшие строки в массив, здесь я их просто печатаю.
Вы действительно не делаете никакого «извлечения» здесь. Какова ваша цель с этим кодом?