如何删除括号之间的文本

时间:2014-04-06 17:44:32

标签: java regex

我想处理从Wikipedia 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("\\{\\{(.*?)\\}\\}", "");

但它并没有真正发挥作用。我想括号中的&#34;括号&#34;引起问题。关于在Stackoverflow上删除括号之间的文本有很多讨论,但我没有找到任何可以解决这个问题的东西

2 个答案:

答案 0 :(得分:2)

您无法与java正则表达式匹配未确定级别的嵌套括号。但是,对于只有一个深度级别的特定示例,并假设最后缺少右括号,您可以使用:

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

如果级别数未确定,您可以:

1)编写一个解析器,按char逐行显示char并在遇到{{时增加堆栈,在遇到}}时减少。当标志等于零时,括号是平衡的。

2)执行替换,直到没有更多替换为:\\{\\{[^{}]*}} (与最里层相匹配)

3)使用支持递归的第三方正则表达式库

4)找到一个处理这种格式的工具(也许它存在)

答案 1 :(得分:0)

我以为我会分享我对这个问题的最终解决方案。我使用了第一个解决方案 Casimir et Hippolyte 建议。这是我的代码:

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);
}