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


1С:Предприятие ::

Метки: 

Вопрос по регулярным выражениям VBScript.RegExp

Я
   toypaul
 
22.12.17 - 16:39
С помощью такого шаблона

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

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

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

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

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

я просто в (0) с ? намудрил уж больно от отсутствия опыта.
   toypaul
 
7 - 22.12.17 - 16:53
insensitive стоял в настройках
   Timon1405
 
8 - 22.12.17 - 16:53
(5) я про пробел(ы)
МояПроцедура   (Парам1)
   toypaul
 
9 - 22.12.17 - 16:55
(8) понял. спасибо
   toypaul
 
10 - 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РазборМодуля;
 
 
   toypaul
 
11 - 22.12.17 - 16:58
Вот так с пробелом после названия функции

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

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



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