Разбить строку по тегам и сохранить части в разные переменные

329
20 января 2017, 06:51

У меня есть строка, части которой обрамлены в теги. Например:

String str = "This text is not highlighted<hlTag>but this is</hlTag>" + 
"this isn't again<hlTag>and this is</hlTag>";

Мне нужно распарсить ее на части — те, что внутри тегов, должны сохранятся в одни переменные, а те, что вне тегов — в другие. Результатом должен быть масив с таких объектов. При этом важно учитывать порядок частей в исходном предложении.

Должно быть как-то так: if highlighted, list.add(new HighlPart(text)), else list.add(new NonHighlPart(text)).

Я написал два регулярных выражения, для частей в тегах и вне их и они работают:

Matcher insideTagsMatcher = Pattern.compile(preTag + "(.+?)" + postTag).matcher(str);
Matcher outsideTagsMatcher = Pattern.compile("^(.*?)" + preTag +
                "|" + postTag + "(.*?)" + preTag +
                "|" + "</hlTag>(.*?)$").matcher(str);

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

Answer 1

Использовать Entry необязательно. Можно просто создать свою обертку.

final static String preTag = "hlTag";
final static String postTag = "/hlTag";
public static void main(String[] args) {
    String str = "This text is not highlighted<hlTag>but this is</hlTag>" +
            "this isn't again<hlTag>and this is</hlTag>";
    String[] strings = str.split("<|>");
    //if value true - in tag, else out tag
    List<Map.Entry<String,Boolean>> result = new ArrayList<>();
    boolean inTag = false;
    for (String s: strings){
        switch (s) {
            case preTag:
                inTag = true;
                break;
            case postTag:
                inTag = false;
                break;
            default:
                result.add(new AbstractMap.SimpleEntry<String, Boolean>(s, inTag));
                break;
        }
    }
}

Результат:

READ ALSO
Удержать socket открытым с клиентской части

Удержать socket открытым с клиентской части

Есть вот такой код клиентской части:

374
Иконки для уведомлений Notification.Builder

Иконки для уведомлений Notification.Builder

Подскажите, какого формата и какого размера должны быть иконки для методов setSmallIcon() и setLargeIcon() и где их можно скачать? Или есть ли в Android стандартные...

361
Не могу проверить по значению?

Не могу проверить по значению?

Всем привет ,хотел проверить наличие интернета вот таким способом

309
Ссылка с атрибутом target = &#39;_blank&#39;

Ссылка с атрибутом target = '_blank'

Нужно открывать ссылку в новой вкладке

281