Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / multiline regexp / 9 сообщений из 9, страница 1 из 1
24.04.2006, 19:27
    #33687186
cooluser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
multiline regexp
Всем привет.

Возникла необходимость из XML документа выдегривать произвольные куски ограниченные открывающим тэгом и закрывающим тэгом, включая сами тэги.

Например:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<root>
<cat>
<!-- тут очень много потомков -->
</cat>
<dog>
<!-- тут очень много потомков -->
</dog>

</root>


Меня например интересует часть документа ограниченная тэгами <cat> ...</cat>

Для решения задачи решил использовать регекспы. Использую пакет org.apache.RE

Проблем в том, что для моих целей нужен многострочный регексп.

Кусок кода следующий:


Код: plaintext
1.
2.
3.
RE re =  new  RE("(<cat>[.|$|^|\n]*</cat>)",RE.MULTILINE);
re.match(sourceXML);
System.out.println(re.getParen( 1 )); //выводится null

Я ожидаю получить не null, я кусок XML ограниченный тэгами <cat>...</cat> включая сами тэги, поскольку моё регулярное выражение работает в режиме RE.MULTILINE, и сам регексп построен таким образом, что после встречи тэга <cat> он допускает любые символы, в том числе окончания строки и начало строки.

Но мне стабильно возвращается null.

В чем моя ошибка?
...
Рейтинг: 0 / 0
25.04.2006, 08:12
    #33687571
knu
knu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
multiline regexp
а парсер какой-нибудь не проще использовать? Странное решение изобретать велосипед..
...
Рейтинг: 0 / 0
25.04.2006, 10:39
    #33687935
unicornmirage
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
multiline regexp
для данного случая лучше свего подойдет SAX Parser. Нужно задать в нем свой собственный обработчик, например


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 class  CatHandler  extends  DefaultHandler {

//вызывается если встречается открывающий тег
 public   void  startElement(String namespaceUri, String localName, String qualifiedName, Attributes attributes) { ...}

//вызывается если встречается тело данных внутри тега
 public   void  characters( char [] chars,  int  startIndex,  int  count) {
{ ...}

...
}

переопределить соответствующие методы, которые будут фиксировать лишь теги <cat>

подробнее про SAX написано в ya.ru или google.com
...
Рейтинг: 0 / 0
25.04.2006, 11:35
    #33688196
wessen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
multiline regexp
а еще лучше Digester для этого случая подойдет.
...
Рейтинг: 0 / 0
25.04.2006, 11:49
    #33688269
cooluser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
multiline regexp
SAX не проще. Регекесп проще некуда в данном случае, у меня проблема в том, что я не очень хорошо понимаю пока еще регекспы, собственно вопрос в том, как орагнизовать правильный процессинг многостроного регекспа, то есть необходимо чтобы символы перевода строки и начала новой строки считались как обычные
...
Рейтинг: 0 / 0
25.04.2006, 12:37
    #33688513
wessen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
multiline regexp
cooluserSAX не проще. Регекесп проще некуда в данном случае, у меня проблема в том, что я не очень хорошо понимаю пока еще регекспы, собственно вопрос в том, как орагнизовать правильный процессинг многостроного регекспа, то есть необходимо чтобы символы перевода строки и начала новой строки считались как обычные

Ну уж если так настаиваете http://www.javable.com/javaworld/07_01/01/

обратите внимание как в там обрабатывются html тели. У вас проблема из-за символа "." в регулярном выражении.
Вот это - (<cat>[.|$|^|\n]*</cat>) то же самое, что и
это - (<cat>[.]*</cat>)
Символ "." это абсолютно любой символ - поэтому у вас и не получается ничего :)
...
Рейтинг: 0 / 0
25.04.2006, 16:51
    #33689475
cooluser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
multiline regexp
wessen спасибо за ответ, но
1. (<cat>[.]*</cat>) тоже не работает, в прочем я пробовал и другие вариации:
2. (<cat>.*</cat>)
3. (<cat>[.^%]*</cat>)

ни одна из них не приводит к успеху и заканчивается результатом описанным в исходном сообщении.

да и даже при условии что символ . соответсвует в том числе переводу строки и началу новой (что по умолчанию не так), то и регексп (<cat>[.|$|^|\n]*</cat>) должен приводить к успеху, поскольку символы внутри [] объединяются через операцию ИЛИ (оператор - |).

так что вопрос все еще открыт
...
Рейтинг: 0 / 0
25.04.2006, 18:22
    #33689794
wessen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
multiline regexp
так хоть как-то работает

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
     public   static   void  main( String[] args ) {

        String exp = "<cat>[\\w\\s<>\\\\!\\.\\,\\:\\;\"-/]*</cat>";

        String data =
            "<root>\n" + 
            "<cat>\n" + 
            "<!--  -->\n</dog>" + 
            "</cat>\n" + 
            "<dog>\n" + 
            "<!-- тут очень много потомков -->\n" + 
            "</dog>\n" + 
            "\n" + 
            "</root>";

        Pattern pattern =
            Pattern.compile( exp );


        Matcher matcher = pattern.matcher( data );

         if  ( matcher.find() ) {
            System.out.println( matcher.group() );
        }  else  {
            System.out.println( "no match" );
        }
    }

А вот как быть с русскими буквами я так и не понял. Т.е. если в таге <cat> будут например коменты по русский, то уже ничего не находится.
...
Рейтинг: 0 / 0
26.04.2006, 08:54
    #33690482
cooluser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
multiline regexp
Проконал вот такой вариант, в режиме Pattern.DOTALL символ . соответствует любым символам, в том числе переводу строки.

С русскими символами проблем вроде нет, хотя может от кодировки зависит.


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
      String exp = "<"+tag+">.*</"+tag+">";		
      Pattern pattern =Pattern.compile( exp,Pattern.DOTALL);


        Matcher matcher = pattern.matcher( sourceXML );

         if  ( matcher.find() ) {
            System.out.println( matcher.group() );
        }  else  {
            System.out.println( "no match" );
        }

...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / multiline regexp / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]