2013-08-13 3 views
1

Я хочу найти XML-теги типа х в тексте,Неожиданное совпадение с Java регулярное выражение

  • пусты (содержит только пробелы)
  • могут или не могут иметь атрибуты

Рекомендуем также что-то вроде этого

<x> </x> 
<x a="v"> </x> 

Я использую следующее регулярное выражение в сочетании с функцией поиска Matcher.

<x.*?> +</x> 

Я получаю спички, которых я не ожидаю. См. Следующий контрольный пример:

@Test 
public void sample() throws Exception 
{ 
    String text = "Lorem <x>ipsum <x>dolor sit amet</x> </x>"; 
    String regex = "<x.*?> +</x>"; 

    Matcher matcher = Pattern.compile(regex).matcher(text); 
    assertFalse(matcher.find()); 
} 

Тест не проходит. Вместо этого это верно.

assertTrue(matcher.find()); 
assertEquals("<x>ipsum <x>dolor sit amet</x> </x>", matcher.group()); 

Означает ли функция поиска не поддерживать неживого оператора или что здесь не так?

PS Я знаю, что существует множество различных способов обработки XML-данных. Но здесь дело не в этом.

+1

[Одна хорошая причина не рисковать по этой дороге] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) – Reimeus

ответ

5

Калькулятор .*? означает, что он найдет как можно меньше символов, чтобы удовлетворить совпадение, это не значит, что он прекратит поиск в первом >, который он находит. Так что в вашем примере, <x.*?> будет соответствовать всем:

<x>ipsum <x>dolor sit amet</x> 

Со всеми персонажами между первым x и окончательной >, удовлетворяющего .*?. Чтобы исправить это, вы можете просто изменить свой рисунок на:

<x[^>]*> +</x> 

На стороне записки, это было сказано много раз, но you should not use regular expressions to parse xml/html/xhtml.

+0

Спасибо за ответ и намек. Я знаю, что регулярное выражение не является подходящим инструментом для обработки xml, но иногда - если вам нужно сделать исправление litte для thausends файлов - быстрая замена текста заманчива. – mkdev

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