正規表現に問題があります。テキスト内のすべての関数を見つける必要があります。私はこの正規表現を持っています\w*\([^(]*\)
。テキストに関数名のない角かっこが含まれなくなるまでは正常に機能します。たとえば、この文字列の'hello world () testFunction()'
場合はとを返しますが()
、testFunction()
必要なのは。だけtestFunction()
です。これをc#アプリケーションで使用して、メソッド文字列に渡されたものを解析したいと思います。誰か助けてもらえますか?ありがとう!
5 に答える
プログラミング言語は階層構造になっているため、一般的な場合、単純な正規表現では解析できません。常に機能する正しいコードを記述したい場合は、LRパーサーを使用する必要があります。ほとんどの機能を利用するハックを適用したいだけの場合は、次のようなものを使用してください。
\w+\([^)]*\)
ただし、これが失敗する場合があることに注意してください。たとえば、コンテキストを参照しないため、関数定義(シグニチャ)と関数呼び出しを区別できません。
(\w+)\(
正規表現グループには括弧なしの変数の名前があります。必要に応じて後で追加できます。パラメーターは必要ないと思います。
パラメータが必要な場合は、以下を使用してください。
\w+\(.*\)
貪欲な正規表現(ネストされた関数呼び出しと一致します)
または...
\w+\([^)]*\)
欲張りでない正規表現の場合(ネストされた関数呼び出しとは一致せず、内側の関数呼び出しのみと一致します)
をに変更*
し+
ます(正規表現の実装に存在する場合は、そうでない場合は実行します\w\w*
)。これにより、(現在の0回以上ではなく)1回以上\w
一致することが保証されます。
試す\w+\([^(]*\)
ここでは、\w*を\w+に変更しました。これは、一致に少なくとも1つのテキスト文字が含まれている必要があることを意味します。
お役に立てば幸い
「関数名」の定義に大きく依存します。たとえば、説明に基づいて、「空の」名前のみを除外し、すべての有効な名前を検索したくないとします。
現在の解決策で十分であり、この空の名前に問題がある場合は、*を+に変更してみてください。括弧の直前に、少なくとも1つの単語文字が必要です。
\w+([^(]*)
また
\w\w*([^(]*)
正規表現アプリケーションの構文によって異なります。