2013-11-19 4 views
2

Очень странное поведение со стороны Андроида функций Java регулярных выражений:андроида регулярного выражения замены ошибка

Я пытаюсь заменить «<file_info.*>» в:

<?xml version="1.0" encoding="utf-8"?> 
<file_info domain_id="ac-demo" language="en" os="androidtab" version="11" > 
    <id string_name="app_name">MobilityPlus</id> 
    <!-- general buttons text --> 
...... 

Призвание: String.replaceAll("<file_info.*>", "<resources>"); И я получаю только заменить часть:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 

А остальное Обрезано !! ЗАЧЕМ??? Мне нужна вся строка, и только найденная часть заменена. Использование по крайней мере 2 онлайн-тестировщиков регулярных выражений и получило именно то, что я хотел, но в Android/Java этого не произойдет.

МОЖЕТ ЛИ ЭТО ЗНАЧИТЬ БУГ? В GOOGLE CODE ??

Любые рекомендации относительно того, как обойти эту проблему, будут наиболее ценными! Спасибо!

(Примечание: я попытался использовать как String.replaceAll() и Pattern + Искатель и оба дают те же результаты, с несколькими линиями флагом и без, и даже после удаления всех \t\r\n ... символов.)

+1

Это не совсем понятно, что вы пытаетесь сделать, но я вполне уверен, что жадным регулярный выражение не собирается делать, что бы это ни было. Вам действительно нужно разбирать XML. – chrylis

+0

Зачем выполнять тяжелую работу (xml parsing, bla bla bla ...), когда вы можете выполнять работу в 3 строках? это было именно то, что я пытался сделать. И похоже, что API-интерфейс regex Android действительно нестандартен или, по крайней мере, отличается (ни один реальный стандарт, который я знаю ...) от стандарта Java. Проблема с этим заключается в том, что вы не можете использовать множество онлайн-тестеров, которые в противном случае соответствовали бы ... –

ответ

2

Попробуйте нежадным квантор DOTALL:

String.replaceAll("(?s)<file_info.*?>", "<resources>"); 

Хотя я должен предостеречь вас от синтаксического анализа/манипулирования XML с использованием регулярных выражений.

+0

Это похоже на лучший ответ из-за жадности :) Тем не менее, с моим низким знанием регулярного выражения , Я не понимаю, почему google не пошел со стандартом java/perl .. или это флаг? –

+2

Я считаю, что регулярное выражение Java также будет вести себя одинаково. Другой способ написать выше: 'String.replaceAll (" (? S) ] *> "," ");' – anubhava

+0

Вы можете проверить [link] (http://gskinner.com/RegExr/) и посмотреть, что простая форма «» работает без каких-либо проблем. То же самое с любым другим онлайн-тестером регулярных выражений.Является ли это проблемой Java? Я обычно работаю с Qt/C++, который более совместим с Perl/стандартным RegEx, поэтому я могу ошибаться ... –

0

Режим MULTILINE не имеет значения, но похоже, что у вас установлен режим DOTALL. Это позволяет . соответствовать символам разделителя строк (\n, \r и т. Д.). Вы на самом деле заменяете все, начиная с первого появления <file_info и заканчивая последним вхождением > в документе.

Но вы не можете рассчитывать на те или любые другие пробельные символы, присутствующие в XML; они только там, чтобы облегчить нам типы wetware для чтения. Если вы хотите заменить только один тег, вы должны использовать отрицание класса символов, например, так:

s = s.replaceAll("<file_info[^>]*>", "<resources>"); 
+0

Спасибо, но это похоже на «жадность» (не большой рег-ex pro) ...). Но хорошо знать, как установить DOTALL прямо в регулярное выражение –

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