使用正则表达式从源代码中提取函数和函数头

时间:2010-07-12 10:39:30

标签: regex

我正在尝试从一些源代码文件中提取函数和函数头。以下是代码类型的示例:

################################################################################
# test module
#
# Description : Test module
#
DATABASE test

###
# Global Vars
GLOBALS
    DEFINE G_test_string    STRING
END GLOBALS

###
# Modular Vars
DEFINE M_counter            INTEGER

###
# Constants
CONSTANT MAX_ARR_SIZE = 100

##################################
# Alternative header
##################################
FUNCTION test_function_1()
    DEFINE  F_x     INTEGER

    LET F_x = 1

    RETURN F_x
END FUNCTION

###################################
# Function:
#   This is a test function
#
# Parameters:
#   in - test
#
# Returns:
#   out - result
#
FUNCTION test_function_2( P_in_var )
    DEFINE  P_in_var    INTEGER

    DEFINE  F_out_var   INTEGER


    LET F_out_var = P_in_var

    RETURN F_out_var
END FUNCTION

FUNCTION test_init_array()
    DEFINE  F_array     ARRAY[ MAX_ARR_SIZE ] OF INTEGER
    DEFINE  F_element   INTEGER

    FOR F_element = 1 TO MAX_ARR_SIZE

        LET F_array[ F_element ] = F_element * F_element

    END FOR

END FUNCTION

功能可能有也可能没有上面的标题。我正在尝试捕获函数源,函数头,函数名和组中传递给函数的任何参数。这是我提出的表达式(我正在使用.Net正则表达式并使用Regex Hero进行测试):

^([#]{0,1}.*?)(FUNCTION\s+(.*?)[(](.*?)[)].*?END FUNCTION) 

除了文件中的第一个函数(test_function_1)之外,这似乎没有问题。 test_function_1的初始分组是捕获从第一行(源文件的顶部)到test_function_1的FUNCTION开始的所有内容。我意识到这是因为文件中有其他注释的#s,但我只想捕获函数头。

1 个答案:

答案 0 :(得分:1)

如果我看到它正确,则您在识别以#开头的行时遇到问题。 要实现此目的,您可以打开RegexOptions.Multiline标志并将函数标头与

匹配
((?:^#.*\s)*)

修改 要实现此目的,您必须关闭RegexOptions.Singleline并将.*?替换为功能正文部分中的[\s\S]*?