powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / RegEx
11 сообщений из 11, страница 1 из 1
RegEx
    #33627683
хм...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
приветствую
Помогите распарсить текст вида (используя регулярные выражения):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
строка содержит буквы пробелы цифры двоеточия
{
	еще строки;
	c произвольным;
	набором символов;
	всегда заканчиваются знаком;
	могут содержать также {фигурные скобки};
};
подобных блоков много
небоходимо получить две группы:
1. ведущая строка
2. все что содержиться в фигурных скобках
...
Рейтинг: 0 / 0
RegEx
    #33633185
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще говоря это не распарсить регулярными выражениями.
Потому что нужен контекст для распознавания {} - открывающей и закрывающей.
...
Рейтинг: 0 / 0
RegEx
    #33633255
хм...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да вроде он есть.. контекст в смысле
каждый интересующий блок заканчивается }; причем с новой строки...
в общем-то файл распарсил перебором всех строк, но вопос остается открытым
...
Рейтинг: 0 / 0
RegEx
    #33633706
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про ведущую строку подумать надо. Что это такое?

Второе парсится чем-то вроде /\{.{0,}\}/
...
Рейтинг: 0 / 0
RegEx
    #33633804
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinПро ведущую строку подумать надо. Что это такое?
Второе парсится чем-то вроде /\{.{0,}\}/
Не годится. Это тебе даст только пару скобок. А вот другие пары которые вложены в эту пару скобок уже не даст.

В общем, варианта два:
Построчное сканирование с ручным подсчетом открывающих-закрывающих скобок.
Рекурсия - выделяешь блоки не содержащие внутри себя скобок, вырезаешь их из исходного текста, и заново.
...
Рейтинг: 0 / 0
RegEx
    #33633825
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl

В общем, варианта два:
Построчное сканирование с ручным подсчетом открывающих-закрывающих скобок.
Рекурсия - выделяешь блоки не содержащие внутри себя скобок, вырезаешь их из исходного текста, и заново.
Можно выделить все блоки внутри скобок. Удалить начальную и конечною скобку (первый и последний символ) и повторить. Имхо проще чем предложенный тобой номер 2.

Ещё можно что-то типа /\{.+(\}|{)/
...
Рейтинг: 0 / 0
RegEx
    #33633838
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinУдалить начальную и конечною скобку (первый и последний символ) и повторить. Имхо проще чем предложенный тобой номер 2.А кто тебе сказал что первый и последний символ в тексте это парные скобки? :)
Посмотри на самый первый пост. Там же все четко описано. Человеку надо просканировать типичный C или C++ исходник и выдать заголовок функции/метода и тело этой функции. В одном *.cpp файле может быть описано несколько функций. Вот их и надо выдать.

SarinЕщё можно что-то типа /\{.+(\}|{)/Нельзя. :)
...
Рейтинг: 0 / 0
RegEx
    #33635570
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм...да вроде он есть.. контекст в смысле
каждый интересующий блок заканчивается }; причем с новой строки...


Контескт должен храниться внутри реализующего RegEx парсера. А там его нету, потому что регулярные выражения должны разбираться автоматом без памяти. А ты должен запоминать, где какая скобка открылась, чтобы к ней подобрать закрывающую.
...
Рейтинг: 0 / 0
RegEx
    #33636374
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlА кто тебе сказал что первый и последний символ в тексте это парные скобки? :)
После /\{.+\}/ первый и последний символы будут {}:)
Эту операцию надо будет повторять пока все блоки не выделенны.
...
Рейтинг: 0 / 0
RegEx
    #33636501
гхм...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
хм...каждый интересующий блок заканчивается }; причем с новой строки...

(для очень ленивых!)
если нет пустых блоков и }; с новой строки - строго конец блока - то одними регекспами можно примерно попробовать проглотить целиком регулярками

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
#!/usr/bin/perl

$/="";
$esc='То-Чего-Не-Может-Быть';
$_=<>;
@arr=/(.*)\ 012 {\ 012 /g;
s/\ 012 /$esc/g;
@arr2=/${esc}{$esc(.*?)ToChegoNeMozetBit};$esc/g;
my $j= 0 ;
map
{
 print ">func: $_\n";
 print ">data: \n";
 $arr2[$j]=~s/$esc/\n/g;
 print "$arr2[$j++]\n";
 print "\n";
} @arr;
...
Рейтинг: 0 / 0
RegEx
    #33636504
гхм...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То есть так, конечно

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
#!/usr/bin/perl

$/="";
$esc='То-Чего-Не-Может-Быть';
$_=<>;
@arr=/(.*)\ 012 {\ 012 /g;
s/\ 012 /$esc/g;
@arr2=/${esc}{$esc(.*?)$esc};$esc/g;
my $j= 0 ;
map
{
 print ">func: $_\n";
 print ">data: \n";
 $arr2[$j]=~s/$esc/\n/g;
 print "$arr2[$j++]\n";
 print "\n";
} @arr;
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / RegEx
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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