我試圖從一些源代碼文件中提取函數和函數頭。以下是代碼類型的一個示例:使用正則表達式從源代碼中提取函數和函數頭
################################################################################
# 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和使用正則表達式英雄一直在測試)的表達式:
^([#]{0,1}.*?)(FUNCTION\s+(.*?)[(](.*?)[)].*?END FUNCTION)
這似乎爲所有,但該文件中的第一個函數(test_function_1)工作正常。 test_function_1的初始分組捕獲第一行(源文件的頂部)中的所有內容,直到test_function_1的FUNCTION開始。我意識到這是因爲文件中有其他評論的#s,但我只想捕獲函數標題。
@cHao - 你沒錯,它是Genero的Informix 4gl版本。 – llihp 2010-07-12 10:49:24
您是否嘗試過真正的解析器而不是僅使用一個正則表達式? – 2010-07-12 10:50:50