Имя: Пароль:
IT
 
Найти объявление функции с помощью Regexp
0 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 Цикл
    паттерн = паттерн + мПаттерн[сч];
КонецЦикла;
сообщить(паттерн);
1 jsmith82
 
01.11.17
23:11
Попробуй через СтрНайти
2 nicxxx
 
01.11.17
23:40
а если так?
Функция
Тест( пар1,
пар2
) Экспорт
; а=1;
  сообщить(1);
КонецФункции
3 jsmith82
 
01.11.17
23:57

    Пока Истина Цикл
        
        ПозКлючевоеСлово = СтрНайти(Текст, "Функция", , ПозНач);
        
        Если ПозКлючевоеСлово = 0 Тогда
            Прервать;
        КонецЕсли;
        
        ПозПерваяСкобка = СтрНайти(Текст, "(", , ПозКлючевоеСлово);
        ИмяФункции = СокрЛП(Сред(Текст, ПозКлючевоеСлово + 7, ПозПерваяСкобка - ПозКлючевоеСлово - 7));
        Структура = Новый Структура();
        Структура.Вставить("ИмяФункции", ИмяФункции);
        
        ПозВтораяСкобка = СтрНайти(Текст, ")", , ПозПерваяСкобка);
        ТекстПараметров = Сред(Текст, ПозПерваяСкобка, ПозВтораяСкобка - ПозПерваяСкобка);
        ТекстПараметров = СтрЗаменить(ТекстПараметров, "(", "");
        ТекстПараметров = СтрЗаменить(ТекстПараметров, ")", "");
        ТекстПараметров = СокрЛП(ТекстПараметров);
        ТекстПараметров = СтрЗаменить(ТекстПараметров, Символы.ПС, "");
        ТекстПараметров = СтрЗаменить(ТекстПараметров, " ", "");
        МассивПараметров = СтрРазделить(ТекстПараметров, ",");
        Структура.Вставить("МассивПараметров", МассивПараметров);
        
        ПозНач = ПозВтораяСкобка + 1;

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

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

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

чтобы многострочные определения поймать.
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.