#java
#java
Вопрос:
У меня есть две строки s1 и s2. Я хочу удалить s2 из s1, если s1 начинается с s2. s2 может иметь переменную длину.
For eg. s1 = 123456789 s2 = 123 output = 456789
For eg. s1 = 123456789 s2 = 12345 output = 6789
Прямо сейчас я выполняю вычисление индекса для s2 из s1, а затем извлекаю подстроку.
Мне любопытно, есть ли лучший способ сделать это? Регулярные выражения?
Комментарии:
1.
String output = s1.startsWith(s2) ? s1.substring(s2.length()) : s1;
.2. псевдокод: if (s1.substr(0,s2.длина). равно(s2)) { s1=s1.substr(s2.длина))`
3. Я действительно не понимаю навязчивой идеи людей использовать регулярные выражения для вещей, которые в них действительно не нуждаются. Что не так с одним вызовом substring() и одним вызовом equals()?
4. Поскольку регулярное выражение, по сути, является универсальным решением для большинства проблем, не то чтобы я согласен использовать его для всего. Так что для многих людей это готовое решение.
5. @nhouser9 Я не знаю, слышали ли вы поговорку «все выглядит как гвоздь, когда у вас есть только молоток». Другими словами, если это единственный инструмент, который вы знаете, это единственный инструмент, который вы пытаетесь использовать.
Ответ №1:
Нет смысла использовать регулярное выражение для простой проблемы с подстрокой. Разбито:
//precondition: s2.length() <= s1.length()
String piece = s1.substring(0, s2.length());
String remainder = s1.substring(s2.length());
return piece.equals(s2) ? remainder : s1;
Или даже короче / упрощеннее:
return s1.startsWith(s2) ? s1.substring(s2.length()) : s1;
Комментарии:
1. Первый подход не всегда работает, например, если
s1
короче, чемs2
. Второй подход правильный, более простой и эффективный.2. Изначально это было предварительным условием, но я отошел от однострочного ответа, чтобы заполнить ответ больше для промежуточных шагов.
Ответ №2:
В том, как вы описываете свою проблему, вы хотите удалить s2 из s1. На самом деле вы хотите заменить все вхождения s2 в s1 пустой строкой, что делается с помощью
s1.replace(s2,"");
Или
s1.replaceFirst(s2,"");
если вы хотите просто удалить первое появление s2
Комментарии:
1. Ни то, ни другое не является правильным. Первый удаляет все вхождения
s2
; второй удаляет первое вхождение, но не обязательно в начале строки.
Ответ №3:
if(s1.startsWith(s2) amp;amp; s1.length() > s2.length()) {
System.out.println(s1.substring(s2.length(), s1.length()));
}
Возможно, что-то вроде этого?