Я получаю с сервера строку с известными и неизвестными частями. Например:
<simp>example1</simp><op>example2</op><val>example2</val>
Я не хочу разбирать XML или использовать синтаксический анализ. Я хочу заменить
<op>example2</op>
с пустой строкой ("") какая строка будет выглядеть так:
<simp>example1</simp><val>example2</val>
Насколько я знаю, он начинается с op (в <>) и заканчивается / op (в <>), но содержимое (example2) может отличаться.
Вы можете указать мне, как это сделать?
Спасибо, обновился до XML. Если у меня есть пример выше, я бы хотел удалить все в op и получить только <val> example2 </val>
Вы можете использовать регулярное выражение. Что-то вроде
<op>[A-Za-z0-9]*</op>
должно совпадать. Но вы можете адаптировать его так, чтобы он лучше соответствовал вашим требованиям. Например, если вы знаете, что могут отображаться только определенные символы, вы можете это изменить. После этого вы можете использовать метод String # replaceAll, чтобы удалить все совпадающие вхождения с пустой строкой.
Взгляните сюда, чтобы проверить регулярное выражение: https://regex101.com/r/WhPIv4/3 и здесь, чтобы проверить метод replaceAll, который принимает регулярное выражение и замену в качестве параметра: https://developer.android.com/reference/java/lang/String#replaceall
Можешь попробовать
str.replace(str.substring(str.indexOf("<op>"),str.indexOf("</op>")+5),"");
Чтобы удалить все, используйте replaceAll()
str.replaceAll(str.substring(str.indexOf("<op>"),str.indexOf("</op>")+5),"");
Пробовал образец,
String str = "<simp>example1</simp><op>example2</op><val>example2</val><simp>example1</simp><op>example2</op><val>example2</val><simp>example1</simp><op>example2</op><val>example2</val>";
Log.d("testit", str.replaceAll(str.substring(str.indexOf("<op>"), str.indexOf("</op>") + 5), ""));
И вывод журнала был
D/testit: <simp>example1</simp><val>example2</val><simp>example1</simp><val>example2</val><simp>example1</simp><val>example2</val>
Как сказал #Elsafar, str.replaceAll("<op>.*?</op>", "")
будет работать.
это удалит только первое появление тега, если я не ошибаюсь.
@Dim используйте replaceAll (), а '5' определяет длину "</op>", а не длину промежуточной строки.
я думаю, все равно не сработает, потому что indexOf также соответствует только первому вхождению.
Протестировал сейчас. Меня устраивает. Пожалуйста, попробуйте образцы строк
@Dim </op>
состоит из 5 символов. +5 перемещает конец подстроки в конец этого токена. этот код делает то, что вы просите.
@Jyoti JK Это работает, только если содержимое <op> совпадает. Если вы попытаетесь поменять один из example2 на что-то другое, у меня это не сработает. Попробуйте, например, <simp>example1</simp><op>example2</op><b>test</b> <op> example 3 </op> <val> example2 < / val>
@peshkira да ты прав !!! как комментарий #Eselfar, str.replaceAll("<op>.*?</op>", "")
будет ответом
Используйте так:
String str = "<simp>example1</simp><op>example2</op><val>example2</val>";
String garbage = str.substring(str.indexOf("<op>"),str.indexOf("</op>")+5).trim();
String newString = str.replace(garbage,"");
Прошу прощения, что не упомянул, но длина не должна быть 5
"заканчивается на / op (in <>)" должно иметь длину 5.
Ой, извини. Понятно
Я объединил все ответы и в итоге использовал:
st.replaceAll("<op>.*?<\/op>","");
Спасибо всем за помощь
Это XML, а не HTML. Что будет, если у вас есть этот
<op><simp>example1</simp>example2</op><val>example2</val>
?