|
Найти объявление функции с помощью 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
|
|
|||
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]* чтобы многострочные определения поймать. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |