3

文字列のような関数呼び出しから引数を抽出しようとしています。例:

GetStatus("Param1", "Param2", "ParamWith\"Quotations\"")

正規表現では役に立たないのですが、エスケープされた引用符を含め、この方法でこれらのパラメーター値を一致させることは可能ですか?

つまり、Param1、Param2、ParamWith"Quotations"

さらに良いことに、関数名を抽出する方法はありますか?括弧と引数が存在する場合は引数のみを抽出しますか?

それが違いを生むなら、私はC#を使用しています。

4

3 に答える 3

1

(で分割およびトリミングして、関数名を取得できます。

ただし、\ "引用符でパラメータを取得することは、この理由だけで少し難しくなります。正規表現を使用してネストされたパターンに一致させることはできますか?。LBのソリューションを参照してください。ただし、前述のように、正規表現はネストを処理するために考案されたものではありません。

パラメータを囲む引用符がない場合、文字列から関数名とすべてのパラメータを取得できるかどうかを尋ねました。ネストされた引用符を回避できることを考えると、これははるかに合理的だと思います。Unixライクなコマンド(つまり、command -optionsパラメーター「引用符付きパラメーター」)を解析する方法については多くの参照があると確信していますが、正規表現を使用してこれにアプローチします。

Regex reg = new Regex("\".*?\"")

これにより、引用符が含まれるすべてのパラメーターが取得されます。次に、元の文字列からすべての一致を削除し、残りのパラメータについて「、」で分割します。これが私が考えていることですが、調べてみるともっと簡単な方法があるかもしれません。

最後のポイントを拡張すると、「GetStatus(Param1、Param2、ParamsWith \ "Quotations \")」のような文字列がある場合、特に\内に「、」がある場合は、何を伝えるべきかわかりません。 「引用」。

于 2012-04-13T16:54:22.023 に答える
0

'('でString.splitを実行してメソッド名を取得し、次に'、'で分割してパラメーターを分割できます。

編集:正規表現を使用するより良い解決策の代わりに、いつでも自分で構文解析を行うことができます。正しく形成された文字列を想定する:

  1. '('の最初の出現を見つけることにより、パラメータリストから名前を分割します。
  2. '('の後の最初の文字に到達するまで空白を無視します
  3. \ "がある場合は、別の\"が見つかるまでパラメータを読んでください。「前に\\がない」は、パラメータの終わりを示します。最初の非空白が「空白」が見つかるまで読み取られない場合(おそらく、文字列に有効なパラメータによって異なります)。それが最初のパラメータです。
  4. '、'、または')'に到達するまで空白をスキップします。'、'の場合は、手順2に戻ります。')'の場合は、パラメータリストの最後にいます。
于 2012-04-13T16:03:32.623 に答える
0

パラメータに文字、数字、空白のみが含まれていると仮定します

string fxn = @"GetStatus(""Param1"", ""Param2"", ""ParamWith\""Quotations\"""")";

var result = Regex.Matches(fxn, @"\""(?<GRP>[\w \\\""]+)\""|(?<GRP>\w+[ ]*)")
    .Cast<Match>()
    .Select(m => m.Groups["GRP"].Value)
    .ToArray();
于 2012-04-13T16:40:56.380 に答える