powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / multiline regexp
9 сообщений из 9, страница 1 из 1
multiline regexp
    #33687186
cooluser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.

Возникла необходимость из 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
multiline regexp
    #33687571
knu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
knu
Гость
а парсер какой-нибудь не проще использовать? Странное решение изобретать велосипед..
...
Рейтинг: 0 / 0
multiline regexp
    #33687935
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для данного случая лучше свего подойдет 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
multiline regexp
    #33688196
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а еще лучше Digester для этого случая подойдет.
...
Рейтинг: 0 / 0
multiline regexp
    #33688269
cooluser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAX не проще. Регекесп проще некуда в данном случае, у меня проблема в том, что я не очень хорошо понимаю пока еще регекспы, собственно вопрос в том, как орагнизовать правильный процессинг многостроного регекспа, то есть необходимо чтобы символы перевода строки и начала новой строки считались как обычные
...
Рейтинг: 0 / 0
multiline regexp
    #33688513
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cooluserSAX не проще. Регекесп проще некуда в данном случае, у меня проблема в том, что я не очень хорошо понимаю пока еще регекспы, собственно вопрос в том, как орагнизовать правильный процессинг многостроного регекспа, то есть необходимо чтобы символы перевода строки и начала новой строки считались как обычные

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

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

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

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

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

Код: 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
multiline regexp
    #33690482
cooluser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проконал вот такой вариант, в режиме 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
9 сообщений из 9, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / multiline regexp
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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