2017-05-19 71 views
0

我試圖利用questions like this one制定一個正則表達式將匹配在類似下面的一個非常簡單的Python語法類似給予函數名所有參數正則表達式的蟒蛇般的功能參數解析

mycall(x, y, hello) 

與所期望的結果:

  • 函數名稱:mycall
  • parame叔0:x
  • 參數1:y
  • 參數2:hello

當然它也應該匹配noparams(),和任意數量的參數。至於我的簡化,我只需要參數名稱,我不允許默認參數或與逗號分隔名稱列表不同的東西。

我嘗試用"(\\s*)([A-Za-z0-9_])+\\(\\)"只匹配函數名字符串開頭空格失敗,與此代碼變種:

std::regex fnregexp(s); 

    std::smatch pieces_match; 

    if (std::regex_match(q, pieces_match, fnregexp)) 
    { 
     std::cout << ">>>> '" << q << "'" << std::endl; 

     for (size_t i = 0; i < pieces_match.size(); ++i) 
     { 
      std::ssub_match sub_match = pieces_match[i]; 
      std::string piece = sub_match.str(); 
      std::cout << " submatch " << i << ": '" << piece << "'" << std::endl; 
     } 
    } 

我有以下輸出" hello()"

>>>> '  hello()' 
    submatch 0: '  hello()' 
    submatch 1: '  ' 
    submatch 2: 'o' 

有了這個非常基本的語法,是否有可能找到函數的名稱及其參數?

乾杯!

+0

不知道到底要什麼解析:函數聲明,比如'高清富(PARAM):'在Python或對函數調用? – besc

+0

一個匹配類似Python的函數頭的字符串,我也可以省略'def'。 – senseiwa

+0

您的輸入是否可以包含多個功能? – Gawil

回答

1

用這個一致性檢查:

^\\s*[A-Za-z_]\\w* *\\(*(?:[A-Za-z_]\\w* *(?:, *[A-Za-z_]\\w* *)*)?\\)$ 

,如果它是確定使用這種用於提取簽名的部分:

\\w+ 

第一個子匹配的是函數名,其餘爲參數。

編輯:Python的正確synthax是[A-Za-z_][A-Za-z0-9_]*

+0

您可以刪除先行,這也將這樣做;)編輯:哦,你只是做了^^ – Gawil

+0

是的,因爲原本的答案沒有提供第一張支票,所以我想其他種類的檢查是必要的。 – horcrux

1

匹配簡單的函數聲明與正則表達式是可行的。對於更復雜的事情,你有一個真正的解決方案就像Boost Spirit一樣正確的想法。

在你的問題中的錯誤是在正則表達式錯誤的關閉parens。比較:

"(\\s*)([A-Za-z0-9_])+\\(\\)" // yours 
"(\\s*)([A-Za-z0-9_]+)\\(\\)" // correct 

您的版本中的捕獲組只捕獲一個字符。由於正則表達式引擎的工作原理,它是匹配的最後一個:。正確的版本包括組中的+,並按照預期捕獲hello