2015-08-04 3 views
2

Здравствуйте, у меня возникла проблема с использованием регулярного выражения с Java.Проблема с регулярной регулярной частью XML с java

Я пытаюсь разобрать этот:

*whatever string* 
<AttributeDesignator AttributeId="MyIDToParse" 
DataType="http://www.w3.org/2001/XMLSchema#string" 
Category="theCategoryIWantToParse" 
MustBePresent="false" 
/> 
*whatever string that may contain the same regular expression* 

с помощью этого кода (Pattern + Сличитель)

Pattern regex = Pattern.compile("AttributeDesignator +AttributeId=\"(.+)\" +.*Category=\"(.+)", Pattern.DOTALL); 
Matcher matcher = regex.matcher(xml); 
while (matcher.find()) { 
    String ID = matcher.group(1); 
    String Category = matcher.group(2); 

Выход следующий:

группы 1:

MyIDToParse" 
    DataType="http://www.w3.org/2001/XMLSchema#string" 
    Category="theCategoryIWantToParse" 
    MustBePresent="false" 
    /> 
    *whatever string that may contain the same regular expression* 

группа2:

theCategoryIWantToParse" 
    MustBePresent="false" 
    /> 
    *whatever string that may contain the same regular expression* 

Я чувствую, что это простая вещь, но я не могу найти то, что я делаю неправильно .. Когда я использовал регулярные выражения в веб-сайт, чтобы проверить их он работает правильно и выделить нужное выражение из моего xml.

+0

@MartinPieters счел нужным удалить мой ответ. Но игнорируйте ответ на свой риск: любая попытка использования регулярных выражений для синтаксического анализа XML будет работать с некоторыми входными файлами и сбой на других. Это не связано с вашими навыками написания регулярных выражений, это фундаментальная теория информатики. –

ответ

2

Попробуйте использовать неживое регулярное выражение.

Pattern regex = Pattern.compile("AttributeDesignator AttributeId=\"(.+?)\".*Category=\"(.+?)\"", Pattern.DOTALL); 
+0

Если вы предлагаете подход с регулярным выражением, вы также хотите использовать ленивое соответствие с '. *?'. Кроме того, '. +?' Не будет соответствовать пустым значениям. –

+0

Спасибо, что у меня есть и улучшение, но в одном документе шаблон может появиться много времени .. прямо сейчас он только анализирует его первый вид. – Neil

+0

@ sasuke256, 'while (matcher.find())' должен проходить через все в идеале. Почему, по-вашему, он соответствует только первым? – Codebender