Почему вы анализируете этот код? Если вы пытаетесь создать свой собственный компилятор, вам понадобится намного больше, чем регулярные выражения. Если вы пишете редактор с подсветкой синтаксиса и завершением ввода с опережением, регулярные выражения могут хорошо справиться с первым, но не вторым.
Тем не менее, самая большая проблема, которую я вижу с вашим регулярным выражением, заключается в том, что вы неправильно обрабатываете продолжения строки. Это: \s+_?
соответствует одному или нескольким пробельным символам, за которыми необязательно следует подчеркивание. Но если есть подчеркивание, оно должно сопровождаться символом новой строки, который вам не подходит. Это достаточно легко исправить - \s+(_\s+)?
- но я не уверен, что вам нужно быть таким конкретным. Я подозреваю, что: [\s_]+
будет так же хорошо.
Что касается избежания явных объявлений подфункций / функций внутри комментариев и строк, то самым простым способом было бы сопоставить их только с левым полем, возможно, с некоторыми вкладками или пробелами для отступа. Это обман, я знаю, но это может быть достаточно для того, что ты делаешь. Я сильно полагался на этот трюк, когда писал сценарий навигации по файлу на Java *1009* для EditPad Pro. Вы не можете делать подобные вещи с регулярными выражениями без использования множества уловок и упрощения предположений. Попробуйте это регулярное выражение:
^(?>('(?<comment>.*[\n\r]+))*)
[ \t]*(?<accessmodifier>(Private|Public))
[\s_]+(?<functiontype>(Sub|Function))
[\s_]+(?<name>\S+)
[\s_]*\((?<parameters>[^()]*)\)
([\s_]+As[\s_]+(?<returntype>\w+))?
|
^[ \t]*(?<endfunction>End (Sub|Function))
Конечно, вам нужно сначала собрать его. Он должен быть скомпилирован с параметрами Multiline
, IgnoreCase
и ExplicitCapture
, но не Singleline
.