Как убрать текст в скобках

1

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

 {{Infobox scientist
     | name        = Albert Einstein
     | image       = Einstein 1921 by F Schmutzer.jpg
     | caption     = Albert Einstein in 1921
     | birth_date  = {{Birth date|df=yes|1879|3|14}}
     | birth_place = [[Ulm]], [[Kingdom of Württemberg]], [[German Empire]]
     | death_date  = {{Death date and age|df=yes|1955|4|18|1879|3|14}}
     | death_place = {{nowrap|[[Princeton, New Jersey]], United States}}
     | children    = [[Lieserl Einstein|"Lieserl"]] (1902–1903?)<br />[[Hans Albert Einstein|Hans Albert]] (1904–1973)<br />[[Eduard
 Einstein|Eduard "Tete"]] (1910–1965)
     | spouse      = [[Mileva Marić]]&nbsp;(1903–1919)<br />{{nowrap|[[Elsa Löwenthal]]&nbsp;(1919–1936)}}
     | residence   = Germany, Italy, Switzerland, Austria, Belgium, United States
     | citizenship = {{Plainlist|
     * [[Kingdom of Württemberg]] (1879–1896)
     * [[Statelessness|Stateless]] (1896–1901)
     * Switzerland (1901–1955)
     * [[Austria–Hungary]] (1911–1912)
     * [[German Empire]] (1914–1918)
     * [[Weimar Republic]] (1919–1933)
     * United States (1940–1955)
     }}

Теперь я хочу знать, как удалить текст между {{ и }}. Это то, что я пытался сделать:

wikitext = wikitext.replaceAll("\\{\\{(.*?)\\}\\}", "");

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

  • 1
    О какой паре {{ и }} вы говорите? Внутренний или внешний?
  • 1
    Ведущие > действительно есть или просто пытаются включить код в ваш вопрос?
Показать ещё 2 комментария
Теги:

2 ответа

2
Лучший ответ

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

\\{\\{(?>[^{}]++|\\{\\{[^}]++}})*}}

Если количество уровней не определено, вы можете:

1) напишите синтаксический анализатор, который перемещает char по char и увеличивает стек, когда вы встречаете {{ и уменьшаетесь при встрече }}. Когда флаг равен нулю, скобки сбалансированы.

2) выполнить замену до тех пор, пока не будет больше замены: \\{\\{[^{}]*}} (что соответствует самому внутреннему уровню)

3) используйте стороннюю библиотеку регулярных выражений, которая поддерживает рекурсию

4) найти инструмент для работы с этим форматом (возможно, он существует)

  • 0
    спасибо за Ваш ответ!
0

Я думал, что разделю свою окончательную резолюцию по этому вопросу. Я использовал первое решение, предложенное Казимиром и Ипполитом. Это мой код:

private String removeTextBetweenTwoChars(String wikitext, char startChar, char endChar)
{
    char[] chararray = wikitext.toCharArray();//All characters in Wikipage
    char[] result = new char[chararray.length];;//Characters between spezified chars including those chars
    int stack = 0;//Stack for processing
    int resultCounter = 0;

    for (int i = 0; i < chararray.length; i++)
    {
        char c = chararray[i];
        if (c == startChar && i+1 < chararray.length && chararray[i+1] == startChar)
        {
            stack++;
            i++;
        }
        else if (chararray[i] == endChar && i+1 < chararray.length && chararray[i+1] == endChar)
        {
            stack--;
            i++;
        }
        else if (stack == 0)
        {
            result[resultCounter] = chararray[i];
            resultCounter++;
        }
    }
    return new String(result);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню