2010-07-12 83 views
1

我試圖從一些源代碼文件中提取函數和函數頭。以下是代碼類型的一個示例:使用正則表達式從源代碼中提取函數和函數頭

################################################################################ 
# 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,但我只想捕獲函數標題。

+0

@cHao - 你沒錯,它是Genero的Informix 4gl版本。 – llihp 2010-07-12 10:49:24

+2

您是否嘗試過真正的解析器而不是僅使用一個正則表達式? – 2010-07-12 10:50:50

回答

1

如果我看到它正確,您有問題確定以#開頭的行。 要做到這一點,你可以打開RegexOptions.Multiline標誌和匹配函數頭與

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

編輯: 對於這個工作,你必須在[\s\S]*?切換OFF RegexOptions.Singleline並更換.*?您功能體部分。

+0

輝煌。感謝那。 – llihp 2010-07-12 11:07:40

相關問題