関数呼び出しを正規表現で抽出できるか

特定の例では、文字列入力(rubyスクリプト)で関数呼び出しを抽出し、いくつかの統計を(javaで)実行したいと考えています。以下の入力例については:

Math.sqrt(2-Math.hypot((3),4))-factorial(5)

使用可能な可能な関数のリストを取得したい(検証は100%正確である必要はなく、誤った推測を含む可能性がある):

{ Math.sqrt, Math.hypot, factorial }

リストは大文字と小文字を区別する必要はありませんが、存在する場合は関数クラスのパスを含める必要があります。

私は素朴な単純な "。* \\((。*)\\)" を試みましたが、動作させることができませんでした。先読みや逆参照を使う必要があるようですが、私はちょっと困っています。私の質問は、私もこれをすることができますか?

1
Rubyのパーサが蹴っているに違いない
追加された 著者 David Heffernan,

4 答え

No. You cannot should not (see edit below) do this.

正規表現は通常の言語にしかマッチできませんが、((1 + 2)* 3)のようなネストされた式が存在する可能性があるため、関数呼び出しを一致させるには関数呼び出し。正規表現はネストされたカッコを扱うことができません。

To learn more about regular languages and the limits of regular expressions, see Regular Expressions (wikipedia)

To solve your particular problem, you might be interested in the following resources, which recommend importing the ruby script and using reflection (wikipedia)


Edit: If all you want is the function name it is possible that you might get regex to work. However:

  • 他にも問題があります。たとえば、メンバー関数が呼び出された場合はどうしますか?コンストラクタ?
  • より多くの情報(例えば引き渡された引数など)を削り取る場合は、プロジェクトを破棄してやり直す必要があります。
3
追加された

あなたの例では、パターン:

(?:\\w+\\.)?\\w+(?=\\()

あなたが望む結果が得られますが、完璧ではありません。私は確信しています。速くて荒い結果があなたの後にあるならば、そうかもしれません!

2
追加された
この例をありがとう。
追加された 著者 Margus,

あなたは試みることができますが、そうでないツールで複雑な文法を解析しようとする多くの問題にぶつかります。状態トークンと以前のトークンは常にプログラミング言語でインポートされるため、無限大をカバーする必要があるケースの数です。

0
追加された

はい、あなたが既に文法やものを使った経験がなければ、この問題に対する正当な解決策は難しいでしょう。しかし、迅速かつ汚れた(そしておそらくは不完全な)解決策が実現可能かもしれません。

ここに私の考えがある...私は何かを欠けているかどうかわからないので、私はルビーを知らない。括弧にマッチする必要はありません...プログラムの構文エラーがないと仮定すると、開き括弧 "("は本当に重要な唯一のものです。

"[A-Za-z_][.A-Za-z_0-9+]*("

ほとんどの言語では、関数は文字またはアンダースコアで始まり、0以上の非スペース非特殊記号文字が続きます。それがこの表現が捉えるものです。それはあなたの例で動作します。もちろん、それは重複したもの(一意になる可能性があります)を返し、コメントの中にものを見つけるでしょうが、すばやく汚れた解決策としては大丈夫です。

0
追加された