我想处理从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ć]] (1903–1919)<br />{{nowrap|[[Elsa Löwenthal]] (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上删除括号之间的文本有很多讨论,但我没有找到任何可以解决这个问题的东西
答案 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);
}