2012-04-24 11 views
0

正規表現に問題があります。私はテキスト内のすべての機能を見つける必要があります。私はこの正規表現\w*\([^(]*\)を持っています。テキストが関数名のない大括弧で囲まれない限り、うまく動作します。たとえば、この文字列の場合は、'hello world() testFunction()'()testFunction()を返しますが、testFunction()しか必要としません。私は私のメソッドの文字列に渡される解析するために私のC#アプリケーションで使用したい。誰か助けてくれますか? ありがとう!正規表現を作成してコードからすべての関数を取得する方法

+0

これは何語ですか? –

+2

私はそれが正規表現で行うことができるかどうかは確かではありませんが、正規表現はこれに最適なツールではありません。私が慣れ親しんでいるプログラミング言語はすべて、[通常の言語ではなく] [文脈自由言語](http://en.wikipedia.org/wiki/Context-free_language)である(http://en.wikipedia.org/wiki)。/Regular_language)。 – amit

+0

'[^(] *'は意味を持ちません。少なくとも '[^]] *'を実行して貪欲でないようにしてください。 – KurzedMetal

答えて

1

は、私は+ wは\にワット* \変更されています。ここ\w+\([^(]*\)

を試してみてください。これは、少なくともの1文字を含む一致が必要であることを意味します。

希望すること

+0

あなたの答えはありがたいが、hello worldとtestFunctionを返す:( – Radislav

1

*+(正規表現の実装に存在する場合は\w\w*)に変更してください。これにより、\wと一致するかどうかが確認されます(現在所有しているゼロ以上ではなく)。回です。

+0

あなたの答えをありがとうが、hello worldとtestFunctionを返す:( – Radislav

1

「関数名」の定義に大きく依存します。たとえば、説明に基づいて、「空の」名前を除外し、すべての有効な名前を探したくないだけです。

現在のソリューションが十分で、この空の名前に問題がある場合は、*を+に変更してください。ブラケットの直前に少なくとも1つの単語文字が必要です。

\w+([^(]*) 

したり、正規表現のアプリケーションの構文に応じて、

\w\w*([^(]*) 

+0

答えてくれてありがとう、hello worldとtestFunctionを返す:( – Radislav

2

プログラミング言語には階層構造があります。つまり、一般的な場合には単純な正規表現では解析できません。常に動作する正しいコードを記述したい場合は、LRパーサーを使用する必要があります。

\w+\([^)]*\) 

しかし、これはいくつかのケースでは失敗することに注意してください:あなたは、単純に、ほとんどの機能を拾うようなものを使用しますハックを適用したい場合。例えば。関数定義(シグネチャ)と関数呼び出しを区別することはできません。なぜなら、それはコンテキストを見ないからです。

+1

Well-described。 –

1

(\w+)\(

正規表現グループがどのparentesisせずに変数の名前を持っているでしょうしたい場合は、あなたがそれらを後で追加することができ、私はあなたがパラメータを必要としないはず。

あなたはその後、使用するパラメータが必要です場合:

貪欲正規表現のための

\w+\(.*\)

(それがネストされた関数呼び出しを一致します)
か...非欲張り正規表現のための

\w+\([^)]*\)

(ネストされた関数呼び出しと一致していない、唯一の内側のいずれかに一致します)

関連する問題