Вход | Регистрация

Информационные технологии :: Математика и алгоритмы

Найти объявление функции с помощью Regexp

Найти объявление функции с помощью Regexp
Я
   nicxxx
 
01.11.17 - 23:09
Коллеги, прошу помощи с шаблоном, который вытаскивает все функции/процедуры из модуля. Сам написал только для случая с одним параметром, а теперь не могу понять, как заставить шаблон работать для нескольких параметров. Если что, вот мой вариант:
Функция(\s|\n)+[A-Za-zА-Яа-я0-9_]+(\s|\n)*\((\s|\n)*[A-Za-zА-Яа-я0-9_]+(\s|\n)*=?(\s|\n)*.+(\s|\n)*,?(\s|\n)*(\s|\n)*\)(\s|\n)*(
Экспорт)?(\s|\n)*;?(\s|\n)*
и код, которым я его собираю:
мПаттерн = Новый Массив;

мПаттерн.Добавить("Функция");
мПаттерн.Добавить("(\s|\n)+");//Пробел или перенос строки. один или более
мПаттерн.Добавить("[A-Za-zА-Яа-я0-9_]+");//имя функции
мПаттерн.Добавить("(\s|\n)*");//Пробел или перенос строки. ноль или более
мПаттерн.Добавить("\(");//скобка

//как написать поиск повторения блока параметра?
//мПаттерн.Добавить("(?<=(\(|,|\s|\n)+)");//Утверждение. Смотрящее назад

//блок описания параметра. одного.
мПаттерн.Добавить("(\s|\n)*");//Пробел или перенос строки. ноль или более
мПаттерн.Добавить("[A-Za-zА-Яа-я0-9_]+");//имя параметра
мПаттерн.Добавить("(\s|\n)*");//Пробел или перенос строки. ноль или более
мПаттерн.Добавить("=?");//знак "равно". 0 или 1
мПаттерн.Добавить("(\s|\n)*");//Пробел или перенос строки. ноль или более
мПаттерн.Добавить(".+");//значение параметра. любой символ до пробела/переноса/запятой
мПаттерн.Добавить("(\s|\n)*");//Пробел или перенос строки. ноль или более
//как быть с запятой?
мПаттерн.Добавить(",?");//запятая. 0 или 1
мПаттерн.Добавить("(\s|\n)*");//Пробел или перенос строки. ноль или более
//конец блока описания параметра

мПаттерн.Добавить("(\s|\n)*");//Пробел или перенос строки. ноль или более
мПаттерн.Добавить("\)");//скобка
мПаттерн.Добавить("(\s|\n)*");//Пробел или перенос строки. ноль или более
мПаттерн.Добавить("(Экспорт)?");//слово Экспорт. ноль или 1
мПаттерн.Добавить("(\s|\n)*");//Пробел или перенос строки. ноль или более
мПаттерн.Добавить(";?"); //ноль или один
мПаттерн.Добавить("(\s|\n)*");//Пробел или перенос строки. ноль или более

паттерн = "";
Для сч=0 По мПаттерн.Количество()-1 Цикл
    паттерн = паттерн + мПаттерн[сч];
КонецЦикла;
сообщить(паттерн);
 
 
   jsmith82
 
1 - 01.11.17 - 23:11
Попробуй через СтрНайти
   nicxxx
 
2 - 01.11.17 - 23:40
а если так?
Функция
Тест( пар1,
пар2
) Экспорт
; а=1;
  сообщить(1);
КонецФункции
   jsmith82
 
3 - 01.11.17 - 23:57
[1C]
    Пока Истина Цикл
        
        ПозКлючевоеСлово = СтрНайти(Текст, "Функция", , ПозНач);
        
        Если ПозКлючевоеСлово = 0 Тогда
            Прервать;
        КонецЕсли;
        
        ПозПерваяСкобка = СтрНайти(Текст, "(", , ПозКлючевоеСлово);
        ИмяФункции = СокрЛП(Сред(Текст, ПозКлючевоеСлово + 7, ПозПерваяСкобка - ПозКлючевоеСлово - 7));
        Структура = Новый Структура();
        Структура.Вставить("ИмяФункции", ИмяФункции);
        
        ПозВтораяСкобка = СтрНайти(Текст, ")", , ПозПерваяСкобка);
        ТекстПараметров = Сред(Текст, ПозПерваяСкобка, ПозВтораяСкобка - ПозПерваяСкобка);
        ТекстПараметров = СтрЗаменить(ТекстПараметров, "(", "");
        ТекстПараметров = СтрЗаменить(ТекстПараметров, ")", "");
        ТекстПараметров = СокрЛП(ТекстПараметров);
        ТекстПараметров = СтрЗаменить(ТекстПараметров, Символы.ПС, "");
        ТекстПараметров = СтрЗаменить(ТекстПараметров, " ", "");
        МассивПараметров = СтрРазделить(ТекстПараметров, ",");
        Структура.Вставить("МассивПараметров", МассивПараметров);
        
        ПозНач = ПозВтораяСкобка + 1;

    КонецЦикла;
[/1C]
   trdm
 
4 - 02.11.17 - 00:02
(0) > Коллеги, прошу помощи с шаблоном, который вытаскивает все функции/процедуры из модуля. Сам написал только для случая с одним параметром, а теперь не могу понять, как заставить шаблон работать для нескольких параметров. Если что, вот мой вариант:

Забей на параметры, ориентируйся на открывающую и закрывающую скобку.
   nicxxx
 
5 - 02.11.17 - 00:16
(3) Спасибо.
Однако этот код
1) испортит значение параметра по-умолчанию, если оно будет текстовое
2) найдет не ту закрывающую скобку.
Пример:
Функция Тест( пар1 = "Текст в параметре()",

Я не придираюсь, просто хочу найти решение для общего случая и не задумываться о том, что у меня там в параметрах может быть.
   SiAl-chel
 
6 - 02.11.17 - 06:28
(0) Сам пример сейчас не накидаю, дословно не помню операторы, но делал вот так.
1. Поиск по всему тексту.
2. Включаем квантификатор нежадности.
3. Ищем слово Функция в строке, которая не начинается на два слэша.
4. Ищем слово КонецФункции или Далее в строке, которая не начинается на два слэша.
   Филиал-msk
 
7 - 02.11.17 - 07:16
(6) Ну хоть кто-то про комментарии вспомнил (:
Теперь ещё осталось учесть строковые константы. Возможно многострочные. При помощи регекспа, да.
   quest
 
8 - 02.11.17 - 07:28
(0)на http://catalog.mista.ru/public/658866/ и не выноси себе мозг регэкспами. Не тот это инструмент для этой задачи.
   v77
 
9 - 02.11.17 - 08:22
(8) +100500 парсер нужно писать
   trdm
 
10 - 02.11.17 - 09:35
Интеллиценз в 7-ке под опенконфом работает без учета таких извращений на скриптах и регекспах.
И особых проблем не испытывает.
 
 Рекламное место пустует
   Сияющий в темноте
 
11 - 02.11.17 - 09:55
решениеидля общего случпя называется парсер
   quest
 
12 - 02.11.17 - 10:00
(10) так и в снегопате тоже без проблем можно сделать. но тс не говорил что ему надо под каким-то окружением запускать
   nicxxx
 
13 - 02.11.17 - 12:14
(10) А пример где-то можно посмотреть?
Запускать буду под окружением oscript, задача - добавить в каждую процедуру вызов трассировщика.
   trdm
 
14 - 02.11.17 - 13:58
(12) Да и в Notepad++ это можно сделать без проблем.
   v77
 
15 - 02.11.17 - 14:58
(13) так тебе просто найти функции что ли? тогда типа такого:
(?iLmsu)(?:^|\s+)((Процедура|Функция)\s+\S+\(.*?\)(\s+Экспорт){0,1})
не знаю какие там у тебя RegExp ы
мои из питона
   Ust89
 
16 - 02.11.17 - 15:03
очень сложный код
   nicxxx
 
17 - 02.11.17 - 16:16
(15) Найти и заменить. Кстати, твой шаблон не захватывает слово Экспорт
   v77
 
18 - 02.11.17 - 16:47
(17) не знаю. у меня захватывает
у тебя какие регэкспы? .NET?

я вот накалякал уже чуть чуть по другому
http://s018.radikal.ru/i527/1711/8b/707c4d6ace8f.png

'(?:^|\s+)((процедура|функция)(\s|\n)+\S+\((\n|.)*?\)((\s|\n)+экспорт){0,1})'
   nicxxx
 
19 - 02.11.17 - 17:58
(18) Сейчас захватывает.
У меня вот такие:
http://oscript.io/syntax/page/РегулярноеВыражение

Я уже написал свой:

(Функция|Процедура)(\s|\n)+[A-Za-zА-Яа-я0-9_]+(\s|\n)*\([A-Za-zА-Яа-я0-9_",=\n\s\d]*(\s|\n)*\)(\s|\n)*(Экспорт)?(\s|\n)*;?(\s|\n)*

Для параметров у меня вот так сделано:
[A-Za-zА-Яа-я0-9_",=\n\s\d]*

чтобы многострочные определения поймать.

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует