Имя: Пароль:
1C
 
Вопрос по регулярным выражениям VBScript.RegExp
0 toypaul
 
гуру
22.12.17
16:39
С помощью такого шаблона

ШаблонФункции.Pattern = "\s*?(\S+?)\([\S\s]*?\)\s*?(экспорт)*?.*";

хочу вытащить имя функции и признак экспортный метод или нет. имя вытаскивается, а признак экспортный или нет - не вытаскивается. как правильно написать?

Строка имеет вид

ИмяФункции(параметры) Экспорт
или
ИмяФункции(параметры)
1 toypaul
 
гуру
22.12.17
16:46
получилось так

ШаблонФункции.Pattern = "\s*?(\S+?)\([\S\s]*?\)\s*(экспорт)?.*";
2 Tateossian
 
22.12.17
16:49
(0) Regex101 говорит, что вытаскивается
Full match надо смотреть, а не submatches
3 Tateossian
 
22.12.17
16:50
Я бы еще флаг insensitive поставил
4 Timon1405
 
22.12.17
16:51
(1) подкину для теста)
Процедура МояПроцедура (Парам1)
5 toypaul
 
гуру
22.12.17
16:52
(4) без процедура надо. у меня "процедура" съедается до
6 toypaul
 
гуру
22.12.17
16:53
(2) ну может быть VBScript.RegExp логика работы другая

я просто в (0) с ? намудрил уж больно от отсутствия опыта.
7 toypaul
 
гуру
22.12.17
16:53
insensitive стоял в настройках
8 Timon1405
 
22.12.17
16:53
(5) я про пробел(ы)
МояПроцедура   (Парам1)
9 toypaul
 
гуру
22.12.17
16:55
(8) понял. спасибо
10 toypaul
 
гуру
22.12.17
16:55
Вот так вот разбивается модуль на функции и процедуры

    idТекст = ".*";
    idПР = "[ \t]*";
    idСтрокаКомментария = "(?://" + idТекст + "$)";
    idФункция = "функция([\S\s]*?)конецфункции";
    idПроцедура = "процедура([\S\s]*?)конецпроцедуры";
    idЛитералСтрока = "(""[^""]*""(?:""[^""]*"")*(?:""[^""]*\s*?|[^""]*(?:""[^""]*"")*"")*?)";
    idКомментарий = "(" + idСтрокаКомментария + "(?:\n" + idПР + idСтрокаКомментария + ")*)";
    idРазборМодуля = idКомментарий + "|" + idЛитералСтрока + "|" + idПроцедура + "|" + idФункция;
    idPattern = idРазборМодуля;
11 toypaul
 
гуру
22.12.17
16:58
Вот так с пробелом после названия функции

ШаблонФункции.Pattern = "\s*?(\S+?)\s*\([\S\s]*?\)\s*(экспорт)?.*";
12 Timon1405
 
22.12.17
17:05
цель-то какая? если что, есть обработка разбора модуля
http://catalog.mista.ru/public/78976/
13 mszsuz
 
22.12.17
21:38
а такой пример?

Процедура ОбновитьПрогресс(Знач ПрогрессЗначение = 0,
   Знач ТекстПрогресса = "Выполняется Процедура (%1%)",
   Знач Показать = Истина)
14 Сияющий в темноте
 
22.12.17
21:58
пишите уже парсер и не мучайтесь
15 ИТ директор
 
22.12.17
22:26
(0) чувак а зачем тебе это понадобилось?
16 toypaul
 
гуру
23.12.17
08:32
(12) в принципе то что нужно. цель такая Построение дерева вызова функций
17 toypaul
 
гуру
23.12.17
08:33
(13) строки и комментарии должны отсекаться. комментарии точно отсекаются. строки надо еще проверить. мне нужно правильно получать тело функции
18 orefkov
 
23.12.17
09:48
(0)
Паш, разбор голого текста модулей регэкспами - дело безблагодатное. И регэкспы получаются монструозными, и всё-равно качественно не работают. То лишнего найдут в комментах, то в кавычках, то чего-то не найдут, что на две строки перенесли.
В снегопате есть хороший предварительный парсер модуля, который преобразует текст модуля в вид, удобный для поиска, но снегопат в 8.3.11 пока не работает.
Могу до понедельника тебе накидать такой построитель дерева вызовов, если надо. А то от ассемблера уже в глазах рябит, отдохну чутка.
19 Лефмихалыч
 
23.12.17
14:55
(0) такие вещи регеэкспами не делаются, имхо. Для этих целей конечные автоматы придуманы
20 Лефмихалыч
 
23.12.17
14:57
это вот, как раз, тот самый редкий случай, когда у программиста есть проблема, он говорит: "я знаю, как это сделать регэкспами" и - вжух! - у него уже две проблемы
21 orefkov
 
25.12.17
09:59
(19)
Строго говоря, регэкспы это и есть конечные автоматы. А для синтакс-разбора просто конечного автомата мало, применяется "конечный автомат с магазинной памятью".
22 Сияющий в темноте
 
25.12.17
10:36
RegExp - это подмножество конечных автоматов.
Если мы хотим строить разбор синтаксиса, то тут нужно менять дальнейшие режимы автомата по найденным ранее значениям.
23 toypaul
 
гуру
25.12.17
10:51
С каментами и строками разобрался по простому - очистил их перед основным разбором. Конечные автоматы это конечно круто, но тут из пушки по воробьям.

(18) Да меня тож от 1С подташнивает, поэтому сам и ковыряюсь :)
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.