Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нежадный паттерн с флагом DOTALL, regex 
V
    Опции темы
Antropoid
Дата 2.12.2010, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

Репутация: 2
Всего: 16



Помогите, плиз с паттерном.

Текст: 
\n\nPar1\n\nPar2\n\nPar3
Ожидаемый результат: 
\n\nPar1
\n\nPar2
\n\nPar3

Текст: 
\n\nPar1\nPar2\n\nPar3
Ожидаемый результат: 
\n\nPar1\nPar2
\n\nPar3

Первый пример работает с таким вот паттерном
Код

Pattern p = Pattern.compile("\n[ \t\f\r]*\n.*");

второй - нет.
Вычитал, что дело в точке(.), \n не считается точкой, чтобы считалось нужно взводить флаг Pattern.DOTALL. Пробовал с флагом - не получается  smile 

Как тут быть?


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
aleksandy
Дата 2.12.2010, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 260
Регистрация: 17.12.2006

Репутация: 4
Всего: 5



Код
private static String escape(String s) {
    StringBuilder sout = new StringBuilder();
    for (int i = 0, len = s.length(); i < len; i ++) {
        char ch = s.charAt(i);
        if (ch == '\n') {
            sout.append("\\n");
        } else {
            sout.append(ch);
        }
    }
    return sout.toString();
}

public static void main(String[] args) throws Exception {
    String s = "\n\nPar1\n\nPar2\n\nPar3";
    Matcher m = Pattern.compile("(\\n{2}(?:[^\\n]|\\n(?!\\n))*)").matcher(s);
    System.out.println("=== " + escape(s) + " ===");
    while (m.find()) {
        System.out.println(escape(m.group(1)));
    }
    s = "\n\nPar1\nPar2\n\nPar3";
    m.reset(s);
    System.out.println("=== " + escape(s) + " ===");
    while (m.find()) {
        System.out.println(escape(m.group(1)));
    }
}


Это сообщение отредактировал(а) aleksandy - 2.12.2010, 09:07
PM   Вверх
Antropoid
Дата 2.12.2010, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

Репутация: 2
Всего: 16



Спасибо за ответ, но к сожалению он не подходит.

Я явно не сказал, но есть еще условие - между \n и \n могут быть whitespaces-символы кроме \n. 
Я это обозначил так:
Код

Pattern p = Pattern.compile("\n[ \t\f\r]*\n.*");

А ваш вариант заточен под невозможность появления \n\n в конце найденной группы.


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
aleksandy
Дата 2.12.2010, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 260
Регистрация: 17.12.2006

Репутация: 4
Всего: 5



Тогда сначала
Код

s = s.replaceAll("\\n\\s+\\n", "\n\n");

а потом как я показал.
PM   Вверх
Kircul
Дата 2.12.2010, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 20.2.2007

Репутация: 6
Всего: 7



Может как нибудь так?
Код

Pattern p = Pattern.compile("(\n[ \t\f\r]*\n.*?)((\n[ \t\f\r]*\n)|$)", Pattern.DOTALL);
Matcher m = p.matcher("\n\nPar1\nPar2\n\nPar3");
int st = 0;
while (m.find(st)) {
    st = m.end(1);
    System.out.println("find >>>" + m.group(1) + "<<<");
}

PM   Вверх
Antropoid
Дата 2.12.2010, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

Репутация: 2
Всего: 16



aleksandy, +1
Kircul, +1 
Сенкс! Оба примера работают!


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
aleksandy
Дата 3.12.2010, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 260
Регистрация: 17.12.2006

Репутация: 4
Всего: 5



Antropoid,  я тут еще немного на досуге поразмышлял и вот что у меня полчилось:
В моем примере надо поменять 16 строку на вот такую
Код
Matcher m = Pattern.compile("\\n\\s*\\n(([^\\n]|\\n(?!\\s*\\n))*)").matcher(s);

А  19  и 25 - на такую 
Код
System.out.println(escape("\n\n" + m.group(1)));


Так будет эффективней.
PM   Вверх
Antropoid
Дата 3.12.2010, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

Репутация: 2
Всего: 16



aleksandy, сенкс!


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0466 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.