Я понимаю, что Java не поддерживает просмотр назад переменной длины с нулевой шириной, но есть ли эффективный и действенный способ имитировать желаемое поведение?

Текст, к которому я применяю регулярное выражение, выглядит примерно так:

blah words blah [tag platform="platform1, platform5" future]Blah Blah blah[/tag] blah more words

В открывающем теге может быть любое количество платформ в списке, в любом порядке, и существует конечное количество возможных значений. Желаемый результат - получить текст между тегами:

Blah Blah blah

Вот что я хочу сделать, чтобы представить список переменных платформ:

(?<=\\[tag platform=\\\\\".*?\\\\\" future\\]).*?(?=\\[/tag\\])

Но, конечно, это вызывает исключение с сообщением Look-behind group does not have an obvious maximum length.

Я подумал об использовании регулярного выражения, чтобы получить всю строку, включая теги (что легко), а затем проанализировать строку. Но это кажется слишком конкретным, и я хотел бы более надежное решение.

2
ScottBro 23 Окт 2018 в 23:49

2 ответа

Лучший ответ

Это должно сработать для вас. Нет необходимости в ретроспективе Просто «захватите» нужную часть и замените всю строку (или что-то еще)

public static void main(String[] args) {
    String s = "blah words blah [tag platform=\"platform1, platform5\" future]Blah Blah blah[/tag] blah more words";
    s = s.replaceAll(".*?\\[tag.*?\\](.*?)(?=\\[.*).*", "$1");
    System.out.println(s);
}

O / P:

Blah Blah blah
2
TheLostMind 23 Окт 2018 в 21:54

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

(?:\[tag platform=\".*?\" future\])(.*?)(?:\[\/tag\])

На Regex101

0
doom87er 23 Окт 2018 в 21:20
52957633