2016-09-19 3 views
1

文字列内の連鎖したC#のような関数をすべて検索する必要があります。例えば、私は、各メソッドを抜け出すしたいとこのような文字列のその括弧の引数:ここ点線の関数とその引数を正規表現で検索する

object.method(1, "2", abc).method2().method3("test(), 1, 2, 3").method4("\"Hi\"") 

私はほとんど働いていた正規表現パターンです:

(?<objectName>[^\}]*?)\.(?<methodName>[^\}]*?)\(((?:[^;"']|"[^"]*"|'[^']*')+)*?\) 

これはのobjectNameを抽出し、そして、正しく最初methodNameのが、 "2"、ABC).method2()。法3( "テスト、1、2、3")、

1を塊。\法4( "\" こんにちは ""

すべてが第3引数に "$ 1"として格納されます。

私の最近のアプローチは、簡単に解析できるようにobjectName仕様を削除することで分けて克服することでした。これにより、明らかにobjectNameを除いて同様の結果が得られます。私はグローバルな結果を得ることができるかどうかを確認するためにこれを行いましたが、正しい正規表現構文を得ることができました。要約すると、複数の連鎖した.method(パラメータ)の出現を "methodName"と "parameters"という名前の構成部分に解析する必要があります。私はいくつかのことを推論してきましたが、私の正規表現のスキルは最高でかなり錆びており、現時点でこれを克服することはできません。私はあなたが提供しなければならないかもしれないどんな助けにも感謝します。私はテストのためにこのサイトを使用している

http://regexstorm.net/tester

UPDATE:明確にするために、要件は、C#のラムダ式、唯一の点線の関数の構文をサポートして含まれていません。これは完全なC#パーサーではありません。唯一必要なのは、点線のメソッド連鎖です。私は混乱のためにお詫び申し上げます。私が脱走しようとしてたパターンは次のとおりです。

object.method(arguments).method(arguments).method(arguments)... 

これに対する私のアプローチは、最初の正規表現の使用を必要としない簡単な操作でオブジェクト名を抽出することでした。もたらすであろう

.method(arguments).method(arguments).method(arguments)... 

:これは今、正規表現は2つの構成部分に解析するために、以下を残すだろう.methodのように()nullの場合もある

method arguments 
method arguments 
method arguments 
... 

引数(行方不明)、または

もたらすであろう
.method.method().method(arguments) 

の方法は、実際のように、プロパティ(なし括弧と引数)であってもよいです
method (null) 
method (string.Empty) 
method arguments 

引数には、開始と終了の間のすべての括弧が含まれます。これらは後でRegex操作で処理されるため、この時点で解析する必要はありません。

これは、この単純なdot-method-openPar-argumentsStr-closeParパターンを検出するRegexの機能のようです。次のdot-method-openPar-argumentsStr-closeParなどです。コメントはありません、ノーラムダ - -

この

は文法の範囲であるだけで(引数).method()object.method ...

私はこのことができます願っています。

+0

すべての()「(」の順番で、グループを作成します。あなたは彼らが出力を希望含めるかどうかを確認するために、より高い$の "$ 2"または 『$ 3』などを使用してみましたか? –

+0

ご希望されます粉砕する私はこのチェーンを紹介します: 'method1( ")。ToString()")。method2(1).method3( ")。Fail()")' – eocron

+0

私は非常によく似た[質問](http:// stackoverflow .com/a/37314847/2729609)はもう少し前です。正規表現は非常に大きくなるだろう。 –

答えて