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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вытащить из текста всё, не удовлетворяющее регулян 
:(
    Опции темы
startpoint
Дата 12.8.2012, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Сразу к делу:
Код
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {

    public static void main(String[] args) {

        String file = "package my.example.model.base;\n" + 
             "// Generated Aug 11, 2012 7:13:37 PM by Hibernate Tools 3.2.4.GA\n" + 
             "\n" + 
             "\n" + 
             "\n" + 
             "/**\n" + 
             " * FileBase generated by hbm2java\n" + 
             " */\n" + 
             "public class FileBase  implements java.io.Serializable {\n" + 
             "\n" + 
             "    private Integer id;\n" + 
             "    private int hostId;\n" + 
             "    private int date;\n" + 
             "\n" + 
             "    public FileBase() {\n" + 
             "    }\n" + 
             "\n" + 
             "    \n" + 
             "    public FileBase(int hostId) {\n" + 
             "        this.hostId = hostId;\n" + 
             "    }\n" + 
             "\n" + 
             "    public FileBase(int hostId, int date) {\n" + 
             "       this.hostId = hostId;\n" + 
             "       this.date = date;\n" + 
             "    }\n" + 
             "   \n" + 
             "    public Integer getId() {\n" + 
             "        return this.id;\n" + 
             "    }\n" + 
             "    \n" + 
             "    public void setId(Integer id) {\n" + 
             "        this.id = id;\n" + 
             "    }\n" + 
             "\n" + 
             "    public int getHostId() {\n" + 
             "        return this.hostId;\n" + 
             "    }\n" + 
             "    \n" + 
             "    public void setHostId(int hostId) {\n" + 
             "        this.hostId = hostId;\n" + 
             "    }\n" + 
             "\n" + 
             "    public int getDate() {\n" + 
             "        return this.date;\n" + 
             "    }\n" + 
             "    \n" + 
             "    public void setDate(int date) {\n" + 
             "        this.date = date;\n" + 
             "    }\n" + 
             "}";
        
        Pattern pattern = Pattern.compile("package[^;]+;|// Generated[^\n]+|/\\*\\*| \\*[^\n]+| \\*/|public class[^\n]+|public FileBase\\([^)]*\\)\\s*\\{[^}]*}|private [^\n]+|}$", Pattern.DOTALL);
        Matcher matcher = pattern.matcher(file);
        while (matcher.find()) {
            System.out.println(matcher.group());
        }
    }
}

Переменная file содержит исходный код класса FileBase, который был Generated by Hibernate Tools. Однако он мне в таком виде не нужен. Ниже, идёт регулярное выражение, которое вытаскивает из этого класса только то, что мне нужно. Именно оно и делает "класс моей мечты".  Если приглядется, то оно просто содержит в себе кучу более менее простых регулярок, разделённых альтернативой. На выходе я получаю следующее:
Код

package my.example.model.base;
// Generated Aug 11, 2012 7:13:37 PM by Hibernate Tools 3.2.4.GA
/**
 * FileBase generated by hbm2java
 */
public class FileBase  implements java.io.Serializable {
private Integer id;
private int hostId;
private int date;
public FileBase() {
    }
public FileBase(int hostId) {
        this.hostId = hostId;
    }
public FileBase(int hostId, int date) {
       this.hostId = hostId;
       this.date = date;
    }
}

Отлично, то что нужно. Однако проблема состоит в том, что моё регулярное выражение запускается не прямо в коде, а в каком то там абстрактном движке, и всё что я могу там сделать - это удалить строки, удовлетворяющие регулярке, а не как здесь - оставить. Так вот, как можно сделать одно большое отрицание к моей регулярке. Т.е. так, чтобы на экран вывелось только то, чего не выводится сейчас ?
PM MAIL   Вверх
startpoint
Дата 16.8.2012, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



я чо, вопрос из области фантастики задал ?
PM MAIL   Вверх
korian
Дата 16.8.2012, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: нет
Всего: 17



Цитата(startpoint @  16.8.2012,  10:54 Найти цитируемый пост)
я чо, вопрос из области фантастики задал ? 

Впринципе да, попробуйте сами написать regexp, который будет находить все строки в которых нету слова "привет".
Регулярки нацелены на то, чтобы найти текст удовлетворяющий условию в regexp, обатное это уже не регулярки.

PM   Вверх
jk1
Дата 17.8.2012, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 40
Всего: 75



Цитата

обатное это уже не регулярки


Есть в регулярках такая штука, называется negative lookahead. Если Ваш "абстрактный движок" их поддерживает, то можно таким образом матчить текст, не удовлетворяющий условию. Пример для java-регэкспов:

Код

 String regex = "John (?!Smith)[A-Z]\\w+";
    Pattern pattern = Pattern.compile(regex);

    String candidate = "I think that John Smith ";
    candidate += "is a fictional character. His real name ";
    candidate += "might be John Jackson, John Westling, ";
    candidate += "or John Holmes for all we know.";

    Matcher matcher = pattern.matcher(candidate);

    String tmp = null;

    while (matcher.find()) {
      tmp = matcher.group();
      System.out.println("MATCH:" + tmp);
    }



--------------------
Opinions are like assholes — everybody has one
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.0446 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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