2012-12-19 7 views
7

可能性の重複:
How to get function parameter names/values dynamically from javascript正規表現は、関数定義からパラメータリストを取得するには

私は現在、javascriptを(Node.jsの)プロジェクトに取り組んでいる私がしようとしています関数の配列の名前が(値ではなく、引数は不要です)を取得します。私は現在Function.toString()を使用して関数文字列を取得し、それに対して正規表現を実行してパラメータリストを取得しています。

paramList = ['paramOne', 'paramTwo'] 
:私は戻って、このような配列を期待するいくつかの文字列の魔法(分割など)をやって、この反対私の正規表現を実行し、

var myFunction = function (paramOne, paramTwo) { ... } 

のは、次の簡単な例を見てみましょう

私は何かが動作しているが、私はそれがおそらく最高のソリューションのいくつかのファンキーな文字javascriptは、変数名を使用することができ、そのJavaScriptは複数の行に関数を定義することができます与えられていないように感じている。ここで

は、私が現在持っているものです。

function.*[\w\s$]*(\((.*[\w\s,$]*)\)) 

これは私にクールでグループ2、中括弧なしでグループ1での私の「一致」してから、私のparamリストを与えます。これは本当に私がしたいことをするための最善の方法ですか?私はこれに使うことができるより良い正規表現はありますか?私は実際には「よりシンプルな」ものを探しているのではなく、実際に起こりうるすべての状況を把握できるものを探しています。

ご協力いただければ幸いです。

答えて

16

最も簡単なことは、最初の括弧内のすべてを取得し、split(/\s*,\s*/)を使用して配列を取得することです。

例:どのように上記の作品

var str = "function( one ,\ntwo,three , four ) { laksjdfl akjsdflkasjdfl }"; 
 
var args = /\(\s*([^)]+?)\s*\)/.exec(str); 
 
if (args[1]) { 
 
    args = args[1].split(/\s*,\s*/); 
 
} 
 
snippet.log("args: " + JSON.stringify(args));
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

:我々は最初の左括弧に一致するように/\(*([^)]+?) *\)/を使用

  1. (以来\(は正規表現で特別なものです)、任意の空白の後に任意の量の空白が続き、続いてキャプチャグループc閉じ括弧を除くすべてのもの(ただし、貪欲ではないもの)に続いて任意の空白が続き、その後には末尾に)が続きます。

  2. 我々は成功した場合、我々は(この空白事がでなぜ引数がゼロ以上の空白文字が続くコンマに続くゼロ個以上の空白文字(\s*)である配列に分割することを意味する、/\s*,\s*/を使用して分割私の例の関数はとても奇妙です)。

あなたが例からわかるように、これは先頭の空白((後の最初の引数の前に)、カンマの周りの空白、改行を含む空白  —末尾を処理します。 ではない引数リスト内のコメントを処理しようとすると、事態が著しく複雑になります。


サイドノート:あなたの対象ブラウザで動作確認を行ってください、Function#toStringは、ソースコードのいくつかのフォームを返すには、非標準機能です。これは広く(デスクトップブラウザでは)サポートされていますが、標準ではありません。いくつかのブラウザはコメントを含み、他のブラウザはコメントを含みません。もし誰かが関数の引数にコメントをつけていると、あなたの解析をうんざりにするかもしれません。彼らはすでにこの道をしてきたとしてあなたは

+0

私はそれについてどう思いますか?それは私の正規表現でやろうとしていることですが、おそらく別のアプローチがありますか?私は単に "("と ")"のインデックスをつけて、その間にあるものを分けることができると思っていますか?それは狂った正規表現よりも良いでしょうか? –

+0

@ JasonL:答えにいくつかのコードを追加しました(そして実際の例)。 –

+0

ありがとう!あなたのソリューションは、私が予想していたよりずっと簡単です。私は現在、javascriptが許すさまざまなバリエーションすべてを試しています。これは、javascriptが許す狂った特殊文字のいずれかをキャプチャしますか(最も有名なものの1つは不承認となります)?私はこれがnode.js環境のみであることに注意してください。本当にV8について心配する必要があります。 –

2

すると、私はあなたが正規表現を使用することをお勧めしてみましょう見つけるん:

  • [一致] /function[^(]*\(([^)]*)\)/引数リストと一致します
  • /\W+/(最初のマッチデータの結果に対して[スプリット] )

そうにparamsリストに試合を分割します、コードは次のようになります。

var s = "function moo (paramOne, paramTwo) { alert('hello'); }"; 
var s2 = s.match(/function[^(]*\(([^)]*)\)/)[1]; 
var paramList = s2.split(/\W+/); 
+0

クール、いい仕事+1 – iConnor

関連する問題