Форум программистов, компьютерный форум, киберфорум
Java EE (J2EE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 12.11.2012
Сообщений: 17
1

Что-то не так с регулярным выражением

29.11.2012, 00:13. Показов 891. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.

Необходимо реализовать поиск #include из *.с файла.

Вот что я делаю:

Java
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package ru.goncharov;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.FileInputStream;
 
import java.io.IOException;
 
import java.util.regex.Pattern;
import java.util.regex.Matcher;
 
import static java.lang.System.out;
 
public class SearProject {
    
    public static final String FILE_PATH = "4.c"; // Путь к файлу
 
    public static void main( String[] args ) throws IOException {
        
        try {
            
        BufferedReader bReader = new BufferedReader(               // Буферизация символьного потока
                                 new InputStreamReader(            // Преобразование потока байтов в символьный поток
                                 new FileInputStream(FILE_PATH))); // Чтение данных из файла
        
        Pattern aPattern = Pattern.compile("((^([^/])include<[a-zA-Z_.0-9]+>)|(^([^/])include\\u0022[a-zA-Z_.0-9]+\\u0022))");
        
        Matcher aMatcher;
        
        String s = null;
        
        out.println("******** Cписок #include: ********\n");
        
        while( (s = bReader.readLine()) != null ) { // Чтение строк
            
            aMatcher = aPattern.matcher(s.replaceAll("[\\s&&[^\r?\n]]+", "")); 
            
            if ( aMatcher.find() ) { // Проверяет последовательность на соответствие
                
                out.println( aMatcher.group() );
                
            } 
             
        }
        
        out.println();
        
        bReader.close();
                
        } catch (Exception e) {
            
            e.printStackTrace();
            
        }
        
    }
    
}
И например из файла, в котором содержаться следующие строчки:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
   #include <stdio.h       >  /* Директива для средств ввода-вывода */
#include <stdlib.h>        /* Директива для функции exit() */
 
   #include <algorithm>
   
   
   
   //#include "my_function.h"
   
   //#include <comment1>
 
   
   /*  #include "comment2.h" */
   // #include "comment3.h"
   /* #include <comment4> */
   
   
      
//include <comment5>*/
Печатается следующий результат:

#include<stdio.h>
#include<stdlib.h>
#include<algorithm>

Но если комментарии разнообразнее:

C
1
2
3
4
5
6
7
8
9
#include <1.h>
//#include <2.h>
/*#include <3.h>*/
#include <4.h>/*
#include "5.h"
*/#include "6.h"
/*34234*/#include <7.h>
#include <8.h>
#include <9.h>
Программа работает неправильно...

Подскажите пожалуйста как подойти к решению данной задачи.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.11.2012, 00:13
Ответы с готовыми решениями:

Что не так с регулярным выражением?
От сюда Groups.enter(this, 81873674, 'bccb900dfe54caeb9a', '_')&quot;&gt; надо вытянуть...

с регулярным выражением.
Имеем текст youtube.com/watch?v=LOZuxwVk7TU&amp;ob=av2em нужно получить то что находится между...

Не получаеться с регулярным выражением
Здравствуйте Подскажите пожалуйста как средствами perl сделать следующее: есть файл со списком...

ФИО регулярным выражением
Добрый день! Нужно сделать программу которая бы используя ТОЛЬКО регулярные выражения выводила бы...

5
512 / 454 / 119
Регистрация: 17.02.2012
Сообщений: 1,032
Записей в блоге: 1
29.11.2012, 01:44 2
Цитата Сообщение от andre_goncharov Посмотреть сообщение
Java
1
Pattern aPattern = Pattern.compile("((^([^/])include<[a-zA-Z_.0-9]+>)|(^([^/])include\\u0022[a-zA-Z_.0-9]+\\u0022))");
Java
1
Pattern aPattern = Pattern.compile("#inc.+?(>|h\")");
0
0 / 0 / 0
Регистрация: 12.11.2012
Сообщений: 17
29.11.2012, 12:55  [ТС] 3
Цитата Сообщение от Drygba Посмотреть сообщение
Java
1
Pattern aPattern = Pattern.compile("#inc.+?(>|h\")");
Закоменнтированные #include выводить не надо. Это я как раз таки и не могу реализовать...
0
512 / 454 / 119
Регистрация: 17.02.2012
Сообщений: 1,032
Записей в блоге: 1
29.11.2012, 14:10 4
так бы и сказали. Я пока вижу только один вариант:
1. Читаем файл в буфер
2. Поэтапно чистим от мусора
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Scanner sc = new Scanner(new File(FILE_PATH));
        StringBuffer sb = new StringBuffer();
    
        while(sc.hasNext()){
            sb.append(sc.nextLine() + "\n");
        }
        sc.close();
        String str = sb.toString().replaceAll("\n", " ").replaceAll("//.+?>|//#.+?\"", "").
                replaceAll("/\\S.+?\\S/", " ").replaceAll("\\S/", "").replaceAll("\\s+", " ").
                replaceAll("h\\s+", "h").replaceAll("\\s+", " ").replaceAll("h\\s+", "h");
      String[] include = str.split("#");
        for (String s : include){
            System.out.println(s);
        }
Выглядит конечно ужасно, но при таком разном форматировании по другому наверно не как.
1
Эксперт Java
4091 / 3825 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
29.11.2012, 18:45 5
Можно одной регуляркой убрать все комментарии - http://ostermiller.org/findcomment.html
1
0 / 0 / 0
Регистрация: 12.11.2012
Сообщений: 17
29.11.2012, 19:41  [ТС] 6
Цитата Сообщение от Drygba Посмотреть сообщение
Выглядит конечно ужасно, но при таком разном форматировании по другому наверно не как.
Спасибо. Мне достаточно такого кода.
0
29.11.2012, 19:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.11.2012, 19:41
Помогаю со студенческими работами здесь

Запутался с регулярным выражением
Смотрел SED'овский туториал и не могу понять последний пример. Что-то вообще слабо укладывается...

Поиск регулярным выражением
Всем доброго утра. Помогите пожалуйста составить регулярное выражение для поиска такой штуки: ...

Помогите с регулярным выражением
Нжно регулярное выражение, для замены определённых символов, по типу чатов или форумов, где таким...

Помогите с регулярным выражением
Имеется данный исходный текст, мне нужно из него выдрать по порядку значения полей &quot;Родился&quot;,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru