Заменить подстроку с начала, заданную другой строкой

#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()));
        }
  

Возможно, что-то вроде этого?