2013-10-03 2 views
0

Я читаю XML-файл wikipedia, в котором мне нужно удалить что-либо между фигурными фигурными скобками. . Для следующей строки:Java: Regex для удаления частей XML-файла

Строка текста = «{{Использование даты DMY | дата = ноября 2012}} {{Infobox музыкальный художник < - Смотрите Википедия: WikiProject_Musicians - > | имя
= Russ Conway | image = | caption = Russ Conway, изображенный на его 1959 году [[Расширенная игра | EP]] '' Подробнее Party Pops ''. | Image_size = | background = non_vocal_instrumentalist | имя_ рождения = Тревор Герберт Стэнфорд | alias = | birth_date = {{birth date | 1925 | 09 | 2 | df = y}} | birth_place = [[Bristol]], [[Англия]], Великобритания | death_date = {{dea го даты и возраст | 2000 | 11 | 16 | 1925 | 09 | 02 | df = y}} | death_place = [[Истбурн]], [[Сассекс]], Англия, Великобритания | origin = | instrument = [[Piano]] | жанр = | род занятий = [[Музыкант]] | years_active = | label = EMI (Колумбия), Pye, MusicMedia, Черчилль | linked_acts = | сайт = | notable_instruments =}} ";

Оно должно быть заменено пустой строкой Обратите внимание, что пример имеет несколько новых линии и вложенное {{...}}

Я использую следующий код.:

Pattern p1 = Pattern.compile(".*\\({\\{.+\\}\\}).*", Pattern.DOTALL); 
Matcher m1 = p1.matcher(text); 

while(m1.find()){ 

String text1 = text.replaceAll(m1.group(1), ""); 
} 

Я новичок в регулярных выражений, пожалуйста, вы можете сказать, что я делаю неправильно?

+1

Вы должны попытаться найти правильный синтаксический анализатор. Регулярное выражение Java не предназначено для неопределенных уровней вложенности. То, что вы делаете неправильно, состоит в том, что '. +' Является жадным и будет соответствовать после первого '{{' до последнего '}}'. – Jerry

+0

У вас есть все теги, но язык программирования, который вы используете. – devnull

+0

@Jerry Это то, что я хочу, удалить все, что находится между первым '{{' и last '}}' – Angad

ответ

1

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

Если у вас есть должно быть использовать regex, вы можете создать громоздкое выражение, которое будет работать до, например, три уровня вложенности, путем кодирования всех возможностей вложенности вручную. Но это было бы чрезвычайно громоздким, фактически было бы нарушением СУХОЙ и нигде не было подходящего инструмента для работы.

Скорее всего, это будет легче сделать «вручную», если потребуется. Сканирование через строку самостоятельно, и каждый раз, когда вы нажимаете {{, увеличивайте «уровень привязки»; каждый раз, когда вы нажимаете }}, уменьшите его. Скопируйте каждый символ на вывод тогда и только тогда, когда уровень скобки равен нулю.

Что-то вроде (непроверенные):

StringBuilder output = new StringBuilder(); 
char[] input = text.toCharArray(); 
int braceLevel = 0; 
for (int i = 0; i < input.length; i++) { 
    final char c = input[i]; 
    if (c == '{') { 
     // Check for {{ 
     if (i < input.length - 1 && input[i+1] == '{') { 
     // Yep, it's a double brace - increase the level, consume 
     // the second character and continue with the next char 
     braceLevel++; 
     i++; 
     continue; 
     } 
    } 
    else if (c == '}' && braceLevel > 0) { 
     // Check for a closing brace similar to above 
     if (i < input.length - 1 && input[i+1] == '}') { 
     braceLevel--; 
     i++; 
     continue; 
     } 
    } 

    if (braceLevel == 0) { 
     output.append(c); 
    } 
} 

// Now output contains every character that was not contained within brackets 
+0

Это работает очень хорошо. Я надеялся, что мне не придётся прибегать к этому. Спасибо за ваши материалы. – Angad

Смежные вопросы