我正在尝试从一些源代码文件中提取函数和函数头。以下是代码类型的示例:
################################################################################
# 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,但我只想捕获函数头。
答案 0 :(得分:1)
如果我看到它正确,则您在识别以#开头的行时遇到问题。
要实现此目的,您可以打开RegexOptions.Multiline
标志并将函数标头与
((?:^#.*\s)*)
修改强>
要实现此目的,您必须关闭RegexOptions.Singleline
并将.*?
替换为功能正文部分中的[\s\S]*?
。