Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967

Парсинг объявления переменных в стиле Си

01.09.2013, 18:43. Показов 1518. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет
Дело было вечером, делать было нечего..
Собственно, вопрос описан в заголовке. К примеру, есть несколько строк вида
C
1
2
3
4
const char foo[] = "Foo";
char *bar;
int arr[10];
int a = 10;
Все эти строки корректно обрабатываются и парсятся.. Однако, поиск идет по всей строке, от начала до конца. И, соответственно, найти можно не более одного вхождения. Собственно, интересует поиск всех вхождений, а не только одного (т.е. поиск не "где строка начинается с .... и заканчивается ...", а "где в строке в любом месте есть лексемы, начинающиеся с ... и заканчивающиеся .....").
То есть, хотелось бы корректно парсить (или хотя бы узнать, есть ли такая возможность) строки вида
C
1
int a = 10, b = 20, c = 30;
Как-то так, надеюсь понятно.

Сама регулярка (для удобства разбил на части)

Java
1
2
3
4
5
6
7
8
9
10
11
"(?ix)"
    + "(?<const>const)?(?:\\s*)"
    + "(?<type>(?:void|int|float|double|string|char)"
    + "(?:\\s*?)(?:\\*[\\*\\s]*?)?)\\s*?"
    + "(?<name>[_a-z][_a-z0-9]*?(?:\\[\\d*?\\])?)\\s*?"
    + "(?:"
        + "(?:=\\s*?)"
        + "(?<value>([_a-z0-9]+)|"
        + "((?<quote>[\"']).*?(\\k<quote>)))"
    + ")?"
    + "\\s*?[,;]"
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public boolean parseDeclare(String str)
{
    Pattern pattern = Pattern.compile(this.patternAssign);
    Matcher matcher = pattern.matcher(str);
 
    if (!matcher.matches())
        return false;
 
    String[] types = {"const","type","name", "value"};
        
    for(String tmp: types)
        System.out.println(tmp + ": " + matcher.group(tmp));
    System.out.println();
        
    return true;
}
P.S., да, я знаю, что регулярка слабовата и не все варианты еще предусмотрены, но интересует вообще возможность парсинга всех вхождений, саму регулярку я потом доделаю..

Не по теме:

Заранее, на вопросы вида "а зачем" - просто ради интереса.
На сообщения вида "код гавно" - я и не претендую на знатока явы :)



Добавлено через 18 минут
в других языках есть модификаторы вида /g или отдельные функции для поиска всех вхождений, есть ли что-то подобное в яве?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.09.2013, 18:43
Ответы с готовыми решениями:

Объявления переменных
Добрый вечер! Подскажите какая разница между объявления переменных в конструкторе (в.1) и в классе (в.2) : В.1 class A { ...

Синтаксис объявления переменных
Приветствую. Поясните, чем отличаются записи List&lt;Note&gt; notes = new List&lt;Note&gt;(); List notes=new List; notes=new...

Нюансы объявления переменных
Здравствуйте. Есть несколько моментов, касающихся объявления переменных, которые пока не вполне понятны: 1 - В чём заключается...

3
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
01.09.2013, 18:54
Цитата Сообщение от KOPOJI Посмотреть сообщение
в других языках есть модификаторы вида /g или отдельные функции для поиска всех вхождений, есть ли что-то подобное в яве?
ну разве что Greedy quantifiers
X? X, once or not at all
X* X, zero or more times
X+ X, one or more times
X{n} X, exactly n times
X{n,} X, at least n times
X{n,m} X, at least n but not more than m times
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
01.09.2013, 19:17  [ТС]
Хотелось узнать именно насчет возможности парсинга множества вхождений без излишних группировок..

Добавлено через 18 минут
К примеру, в php есть отдельная функция - preg_match_all, выдающая все вхождения..
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
header('Content-type: text/html; charset=utf-8');
 
$pattern = "~(?P<const>const)?(?:\\s*?)"
    . "(?P<type>(?:void|int|float|double|string|char)"
    . "(?:\\s*?)(?:\\*[\\*\\s]*?)?)?\\s*?"
    . "(?P<name>[_a-z][_a-z0-9]*?(?:\\[\\d*?\\])?)\\s*?"
    . "(?:"
        . "(?:=\\s*?)"
        . "(?P<value>([_a-z0-9]+)|"
        . "((?P<quote>[\"']).*?(?P=quote)))"
    . ")?"
    . "\\s*?[,;]\\s*?~iu";
if(preg_match_all($pattern, 'int a = 10, b = 20, c = 30;', $matches, PREG_SET_ORDER))
    print_r($matches);
Bash
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
administrator@administrator-K53SC:~$ php -f /var/www/test/index.php
Array
(
    [0] => Array
        (
            [0] => int a = 10,
            [const] => 
            [1] => 
            [type] => int
            [2] => int
            [name] => a
            [3] => a
            [value] => 10
            [4] => 10
            [5] => 10
        )
 
    [1] => Array
        (
            [0] =>  b = 20,
            [const] => 
            [1] => 
            [type] => 
            [2] => 
            [name] => b
            [3] => b
            [value] => 20
            [4] => 20
            [5] => 20
        )
 
    [2] => Array
        (
            [0] =>  c = 30;
            [const] => 
            [1] => 
            [type] => 
            [2] => 
            [name] => c
            [3] => c
            [value] => 30
            [4] => 30
            [5] => 30
        )
 
)
administrator@administrator-K53SC:~$
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
04.09.2013, 16:03  [ТС]
Лучший ответ Сообщение было отмечено tezaurismosis как решение

Решение

Решение найдено Если вдруг кому-то понадобится - есть метод find(), который "сдвигает" на следующее вхождение
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public boolean parseDeclare(String str)
{
    Pattern pattern = Pattern.compile(this.patternAssign);
    Matcher matcher = pattern.matcher(str);
 
    String[] types = {"const","type","name", "value"};
 
    while(matcher.find())
    {
        for(String tmp: types)
            System.out.println(tmp + ": " + matcher.group(tmp));
        System.out.println();
    }
        
    return false;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.09.2013, 16:03
Помогаю со студенческими работами здесь

Насчет объявления переменных
Здравствуйте, форумчане ! У меня создан проект в WF и события обрабатываются в каждой кнопке. Но для обработки данных событий нужно...

Что за объявления переменных?
День добрый! Скачал библиотеку, а там в объявлении класса: private: double(*d_y)(double); и соответственно в...

Порядок объявления переменных
Прошу помощи/совета. Есть код: #include &quot;stm32f4xx.h&quot; #include &quot;stm32f4xx_rcc.h&quot; #include &quot;stm32f4xx_gpio.h&quot; #include...

Объявления непонятных переменных
Привет всем, только начал изучать js/jquery и пытаюсь разобратся в коде. Есть такой момент: var checkBoxes = $('#answers , #answers ');...

Мистика с последовательностью объявления переменных
Здравствуйте! Решил навести порядок в коде. Закомментировать, сгруппировать переменные в блоки по назначению. Скетч скомпилировался...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru