| 
    
            
         
         | 
    
  | 
Вопрос по регулярным выражениям 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С подташнивает, поэтому сам и ковыряюсь :)  | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |