2012-03-23 1 views
1

Я пытаюсь проанализировать следующую строку, myline в Java, и она продолжает бросать нулевое значение.Проведите анализ строки, используя Pattern.compile

Вот моя попытка получить «000000010».

myline = "<status> <id>000000010</id> <created_at>2012/03/11</created_at> <text>@joerogan Played as Joe Savage Rogan in Undisputed3 Career mode, won Pride GP, got UFC title shot against Shields, lost 3 times, and retired</text> <retweet_count>0</retweet_count> <user> <name>Siggi Eggertsson</name> <location>Berlin, Germany</location> <description></description> <url>http://www.siggieggertsson.com</url> </user></status>" 
p = Pattern.compile("(?i)<id.*?>(.+?)</id>", Pattern.DOTALL); 
m = regex.matcher(myline); 
id =m.group(1); 

Любой совет?

+4

Извлечение данных из XML-документа с помощью регулярного выражения - плохая идея. Посмотрите на парсер XML. – pimaster

+0

@ пользователь1289238 пожалуйста, вы не можете принять ответ, спасибо. – Adam

ответ

2

Вы не должны использовать регулярное выражение для анализа XML в первую очередь.

Но помимо этого, вы не используете регулярное выражение правильно. Это не достаточно, чтобы создать экземпляр matcher объекта, вы должны сказать ему что-то сделать:

if (m.find()) 
{ 
    id = m.group(1); 
} 
0

это работает

String myline = "<status> <id>000000010</id> <created_at>2012/03/11</created_at> <text>@joerogan Played as Joe Savage Rogan in Undisputed3 Career mode, won Pride GP, got UFC title shot against Shields, lost 3 times, and retired</text> <retweet_count>0</retweet_count> <user> <name>Siggi Eggertsson</name> <location>Berlin, Germany</location> <description></description> <url>http://www.siggieggertsson.com</url> </user></status>"; 
Pattern p = Pattern.compile(".*<id>(.+)</id>.*"); 
Matcher m = p.matcher(myline); 
if (m.matches()) { 
    String id = m.group(1); 
    System.out.println(id); 
} 

[Edit:] это работает, и это лучше:

String myline = "<status> <id>000000010</id> <created_at>2012/03/11</created_at> <text>@joerogan Played as Joe Savage Rogan in Undisputed3 Career mode, won Pride GP, got UFC title shot against Shields, lost 3 times, and retired</text> <retweet_count>0</retweet_count> <user> <name>Siggi Eggertsson</name> <location>Berlin, Germany</location> <description></description> <url>http://www.siggieggertsson.com</url> </user></status>"; 
Pattern p = Pattern.compile("<id>(.+)</id>"); 
Matcher m = p.matcher(myline); 
if (m.find()) { 
    String id = m.group(1); 
    System.out.println(id); 
} 
+0

Оба они не работают, если в строке содержится более одного '' ', если тег' 'имеет какие-либо атрибуты или если содержимое тега содержит символы новой строки. –

+0

уверен, я полностью согласен с частью комментария «Вы не должны использовать регулярное выражение для анализа XML». –

3

Настоятельно рекомендуем использовать синтаксический анализатор XML. Есть одна встроенная в Java, вот пример решения вашей проблемы. Обработчики исключений опущены для простоты.

DocumentBuilderFactory factory = DocumentBuilderFactory 
     .newInstance(); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
String input = "<status> <id>000000010</id> <created_at>2012/03/11</created_at> <text>@joerogan Played as Joe Savage Rogan in Undisputed3 Career mode, won Pride GP, got UFC title shot against Shields, lost 3 times, and retired</text> <retweet_count>0</retweet_count> <user> <name>Siggi Eggertsson</name> <location>Berlin, Germany</location> <description></description> <url>http://www.siggieggertsson.com</url> </user></status>"; 
Document document = builder.parse(new InputSource(new StringReader(
     input))); 
String value = document.getElementsByTagName("id").item(0) 
     .getTextContent(); 
System.out.println(value); 
+0

Проблема в том, что я на самом деле не имею дело с XML-файлом, это текстовый файл с XML-входом внутри. Поэтому я не думаю, что использование анализатора XML будет работать, не так ли? – user1289238

+1

он делает, он просто показал вам, как :) –

+0

Спасибо! Он просто работает как шарм – user1289238