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

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

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

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

Необходимо реализовать поиск #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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.11.2012, 00:13
Ответы с готовыми решениями:

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

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

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

5
 Аватар для Drygba
512 / 454 / 119
Регистрация: 17.02.2012
Сообщений: 1,032
Записей в блоге: 1
29.11.2012, 01:44
Цитата Сообщение от 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  [ТС]
Цитата Сообщение от Drygba Посмотреть сообщение
Java
1
Pattern aPattern = Pattern.compile("#inc.+?(>|h\")");
Закоменнтированные #include выводить не надо. Это я как раз таки и не могу реализовать...
0
 Аватар для Drygba
512 / 454 / 119
Регистрация: 17.02.2012
Сообщений: 1,032
Записей в блоге: 1
29.11.2012, 14:10
так бы и сказали. Я пока вижу только один вариант:
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
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
29.11.2012, 18:45
Можно одной регуляркой убрать все комментарии - http://ostermiller.org/findcomment.html
1
0 / 0 / 0
Регистрация: 12.11.2012
Сообщений: 17
29.11.2012, 19:41  [ТС]
Цитата Сообщение от Drygba Посмотреть сообщение
Выглядит конечно ужасно, но при таком разном форматировании по другому наверно не как.
Спасибо. Мне достаточно такого кода.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.11.2012, 19:41
Помогаю со студенческими работами здесь

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

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

Поиск регулярным выражением
Всем доброго утра. Помогите пожалуйста составить регулярное выражение для поиска такой штуки: ИЗВЕСТНО - заранее известное слово, в...

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru