Я хочу обрабатывать статьи, извлеченные из 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("\\{\\{(.*?)\\}\\}", "");
Но это не работает. Я думаю, что "скобки в скобках" вызывают проблемы. Существует много дискуссий об удалении текста между скобками в Stackoverflow, но я не нашел ничего, что могло бы решить эту проблему
Вы не можете сопоставлять с регулярными выражениями java неопределенный уровень вложенных скобок. Однако для вашего конкретного примера, который имеет только один уровень глубины, и считая, что в конце отсутствуют закрывающие скобки, вы можете использовать это:
\\{\\{(?>[^{}]++|\\{\\{[^}]++}})*}}
Если количество уровней не определено, вы можете:
1) напишите синтаксический анализатор, который перемещает char по char и увеличивает стек, когда вы встречаете {{
и уменьшаетесь при встрече }}
. Когда флаг равен нулю, скобки сбалансированы.
2) выполнить замену до тех пор, пока не будет больше замены: \\{\\{[^{}]*}}
(что соответствует самому внутреннему уровню)
3) используйте стороннюю библиотеку регулярных выражений, которая поддерживает рекурсию
4) найти инструмент для работы с этим форматом (возможно, он существует)
Я думал, что разделю свою окончательную резолюцию по этому вопросу. Я использовал первое решение, предложенное Казимиром и Ипполитом. Это мой код:
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);
}
{{
и}}
вы говорите? Внутренний или внешний?>
действительно есть или просто пытаются включить код в ваш вопрос?