我想寫一個正則表達式,它會給我只返回類型的C文件中的任何(見編輯)C函數,忽略空格和換行符,但我'米沒有任何運氣。 編輯:返回類型我要考慮的只有基本C data types正則表達式:返回類型的C函數
例子:
signed
long long
int function1 (int j, int n)
應該給我:
signed long long int
我怎麼能寫(或者想了溶液)這個正則表達式?
我想寫一個正則表達式,它會給我只返回類型的C文件中的任何(見編輯)C函數,忽略空格和換行符,但我'米沒有任何運氣。 編輯:返回類型我要考慮的只有基本C data types正則表達式:返回類型的C函數
例子:
signed
long long
int function1 (int j, int n)
應該給我:
signed long long int
我怎麼能寫(或者想了溶液)這個正則表達式?
問題中最難的部分可能是回答這個問題:「我怎麼知道我已經達到了函數定義的開始」。考慮到C的各種規則,目前尚不清楚是否存在「肯定火」的答案 - 所以你可能做的最好的做法是提出一條能夠捕捉「最多」情況的規則。
函數定義將有
void, signed, unsigned, short, long, char, int, float, double, *)
這意味着像這樣的東西應該可以工作:(演示:http://regex101.com/r/oJ3xS5)
((?:(?:void|unsigned|signed|long|short|float|double|int|char|\*)(?:\s*))+)(\w+)\s*\(
注意 - 這並不是「清理格式」 - 所以跨越多行的返回值定義仍然會這樣做。它具有優勢(與其他解決方案相比),它專門針對您問題中鏈接中定義的基本類型。
另請注意 - 您需要g
標誌來捕獲所有實例;我在自己的捕獲組(\w+)
中捕獲函數名稱本身。如果你不想/需要,你可以省略括號。但我認爲同時使用返回類型和函數名稱可能很有用。事後思考:如果你第一次去掉多個空格並返回,上面的代碼仍然可以工作,但是現在在返回值中沒有多餘的空白。例如,你可以通過運行你的代碼
cat source.c | tr '\n' ' ' | sed 's/\s+/ /' > strippedSource.c
然後用上面的正則表達式處理。
串聯使用OR運算符的所有單詞:
\b((void|unsigned|signed|char|short|int|long|float|double)\s*)+\b
的\b
在開始和結束是防止局部功能名稱彈出(void longjmp
想到)。
這不會捕獲類型定義,如uchar_8
,或複雜的指針指針結構,如void (* int)(*)
(我剛剛提出,它可能沒有任何意義)。
這也會返回變量類型 - 而不僅僅是函數返回類型。 – Floris
啊,對。我想,僅僅添加一個前瞻'(?= \()'可能是不夠的。 – usr2564301
相關:http:// stackoverflow。com/questions/476173/regex-to-pull-out-c-function-prototype-declarations請注意,返回函數指針的函數是令人討厭的。 – nhahtdh
你不能。 C類型的語言不能被正則表達式識別。然後有預處理器想想 - 你是否希望識別宏的使用,如'RETURN_CALLBACK(function,name_var)int(* function(char * name_var))(void *,int)'?你想達到什麼目的? – Gilles
@Gilles我試圖制定一個Flex規則。我並不關心預處理器 - 我只需要考慮基本的[C數據類型](http://en.wikipedia.org/wiki/C_data_types)和指向它們的指針 – Eduard