Заменить часть строки с известным началом и концом

Я получаю с сервера строку с известными и неизвестными частями. Например:

<simp>example1</simp><op>example2</op><val>example2</val>

Я не хочу разбирать XML или использовать синтаксический анализ. Я хочу заменить

<op>example2</op>

с пустой строкой ("") какая строка будет выглядеть так:

<simp>example1</simp><val>example2</val>

Насколько я знаю, он начинается с op (в <>) и заканчивается / op (в <>), но содержимое (example2) может отличаться.

Вы можете указать мне, как это сделать?

Это XML, а не HTML. Что будет, если у вас есть этот <op><simp>example1</simp>example2</op><val>example2</val>?

m0skit0 02.05.2018 13:00

Спасибо, обновился до XML. Если у меня есть пример выше, я бы хотел удалить все в op и получить только <val> example2 </val>

Dim 02.05.2018 13:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
2
3 204
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете использовать регулярное выражение. Что-то вроде

<op>[A-Za-z0-9]*</op>

должно совпадать. Но вы можете адаптировать его так, чтобы он лучше соответствовал вашим требованиям. Например, если вы знаете, что могут отображаться только определенные символы, вы можете это изменить. После этого вы можете использовать метод String # replaceAll, чтобы удалить все совпадающие вхождения с пустой строкой.

Взгляните сюда, чтобы проверить регулярное выражение: https://regex101.com/r/WhPIv4/3 и здесь, чтобы проверить метод replaceAll, который принимает регулярное выражение и замену в качестве параметра: https://developer.android.com/reference/java/lang/String#replaceall

Вы можете использовать <op>.*?</op> для соответствия любому символу.

Eselfar 02.05.2018 13:21

Можешь попробовать

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>", "") будет работать.

это удалит только первое появление тега, если я не ошибаюсь.

peshkira 02.05.2018 12:51

@Dim используйте replaceAll (), а '5' определяет длину "</op>", а не длину промежуточной строки.

Jyoti JK 02.05.2018 12:53

я думаю, все равно не сработает, потому что indexOf также соответствует только первому вхождению.

peshkira 02.05.2018 12:58

Протестировал сейчас. Меня устраивает. Пожалуйста, попробуйте образцы строк

Jyoti JK 02.05.2018 13:00

@Dim </op> состоит из 5 символов. +5 перемещает конец подстроки в конец этого токена. этот код делает то, что вы просите.

Chris H 02.05.2018 13:45

@Jyoti JK Это работает, только если содержимое <op> совпадает. Если вы попытаетесь поменять один из example2 на что-то другое, у меня это не сработает. Попробуйте, например, <simp>example1</simp><op>example2</op><b>test</b> <op> example‌ 3 </op> <val> example2 <‌ / val>

peshkira 02.05.2018 14:42

@peshkira да ты прав !!! как комментарий #Eselfar, str.replaceAll("<op>.*?</op>", "") будет ответом

Jyoti JK 03.05.2018 06:02

Используйте так:

    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

Dim 02.05.2018 12:52

"заканчивается на / op (in <>)" должно иметь длину 5.

Deven 02.05.2018 12:54

Ой, извини. Понятно

Dim 02.05.2018 12:55
Ответ принят как подходящий

Я объединил все ответы и в итоге использовал:

st.replaceAll("<op>.*?<\/op>","");

Спасибо всем за помощь

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