マッチング(基本)関数宣言 -- java フィールド と regex フィールド 関連 問題

Matching (Basic) Function Declarations












0
vote

問題

日本語

ソースコードファイルから個別にすべての関数定義を取得したいです。最終的には、すべての機能名を取得するだけです。ソースファイルは次の形式です。

<事前> <コード> #include bla first_function_name() { } second_function_name(first_parameter, second_parameter) { i = 0; }

アクセス修飾子と戻り型はありません。これは、Javaプログラミング言語を解析するためのではなくです。

正規表現を介してソリューションを実装したいです。これまでのところ、私は関数定義を一致させることができましたが、正規表現が単一の関数だけでなく、その後来るものだけでは問題があります。基本的には、閉鎖ブレースでは終わりません。 $ 記号を使用してみましたが、正規表現も終了していません。

私が現在使用している正規表現:

<事前> <コード> private static final String FUNCTION_NAME_MATCHER = "[a-zA-Z]\w*"; private static final String FUNCTION_MATCHER = "(?s)" + FUNCTION_NAME_MATCHER + "[(].*[)].*[\{]([^\}]*)?[\}]";

次の機能を一致させるのをやめるにはどうすればよいですか。上記の関数の例では2回一致する必要がありますが、代わりに一度だけ一致する(一度に両方の関数定義)。

一致した関数定義のリストを取得する方法は次のようになります。

<事前> <コード> public List<String> getMatches() { List<String> matchedResults = new ArrayList<>(); Matcher matcher = Pattern.compile(FUNCTION_MATCHER).matcher(sourceFile); while (matcher.find()) { String functionDefinition = matcher.group(); String functionName = functionDefinition.split(FUNCTION_NAME_MATCHER)[0]; matchedResults.add(functionName); } return matchedResults; }
英語

I want to retrieve all function definitions individually from a source code file. Ultimately, I want to just retrieve all function names. Source files are of the following form:

#include bla  first_function_name() { }  second_function_name(first_parameter, second_parameter) {     i = 0; } 

Note that there are no access modifiers and return types, this is NOT for parsing the Java programming language.

I want to implement the solution via regular expression. So far I managed to match function definitions, however I'm having the problem that the regular expression doesn't only match a single function but also the ones coming afterwards. Basically, it doesn't end at the closing brace. I tried using the $ symbol but it's also not ending the regular expression.

The regular expressions I'm currently using look like this:

private static final String FUNCTION_NAME_MATCHER = "[a-zA-Z]\w*"; private static final String FUNCTION_MATCHER = "(?s)" + FUNCTION_NAME_MATCHER + "[(].*[)].*[\{]([^\}]*)?[\}]"; 

How do I stop it from matching the following function(s) as well? It should match twice for the above example functions but instead it only matches once (both function definitions at once).

The method for getting a list of matched function definitions looks like this:

public List<String> getMatches() {     List<String> matchedResults = new ArrayList<>();     Matcher matcher = Pattern.compile(FUNCTION_MATCHER).matcher(sourceFile);      while (matcher.find())     {         String functionDefinition = matcher.group();         String functionName = functionDefinition.split(FUNCTION_NAME_MATCHER)[0];         matchedResults.add(functionName);     }      return matchedResults; } 
</div
     
   
   

回答リスト

1
 
vote
vote
ベストアンサー
 

これを試してください <事前> <コード> private static final String FUNCTION_NAME_MATCHER = "([a-zA-Z]\w*)"; private static final String FUNCTION_MATCHER = "(?s)" + FUNCTION_NAME_MATCHER + "\([^)]*\)\s*\{[^}]*\}"; public static List<String> getMatches() { List<String> matchedResults = new ArrayList<>(); Matcher matcher = Pattern.compile(FUNCTION_MATCHER).matcher(sourceFile); while (matcher.find()) { matchedResults.add(matcher.group(1)); } return matchedResults; }

 

Try this

private static final String FUNCTION_NAME_MATCHER = "([a-zA-Z]\w*)"; private static final String FUNCTION_MATCHER = "(?s)" + FUNCTION_NAME_MATCHER + "\([^)]*\)\s*\{[^}]*\}";  public static List<String> getMatches() {     List<String> matchedResults = new ArrayList<>();     Matcher matcher = Pattern.compile(FUNCTION_MATCHER).matcher(sourceFile);      while (matcher.find())     {         matchedResults.add(matcher.group(1));     }      return matchedResults; } 
</div
 
 
1
 
vote

* は貪欲で、見つかる可能性のあるすべてのマッチング文字を選択します。 <コード> [(].*[)] の部分は、最初の関数の最初の ( からの最後の ) までのすべての ( から消費しています。第二。あなたはそれが必要な場合にのみキャラクターを消費するのであろう場所を消極的にしたいです。 <コード> .* をすべて変更することで<コード> readOnly=true0

を変更します。

また、おそらく機能宣言と本体の間の空白だけを一致させたいので、 readOnly=true1 readOnly=true2

に置き換える必要があります。

readOnly=true3 readOnly=true4 および readOnly=true5 に囲む場合は、キャプチャグループにキャプチャーするため、抽出できます。

 

* is greedy, it will select every possible matching character that it can find. Right now the [(].*[)] part is consuming everything starting at the first ( in the first function all the way to the last ) in the second. You want to make it reluctant, where it will only consume a character if it needs to. Do so by changing all the .* to .*?

Also, you probably want to match only whitespace between the function declaration and body, so you should replace [)].*[\{] with [)]\s*[\{]

If you enclose the FUNCTION_NAME_MATCHER and the arguments with ( and ) it will be captured into a capture group so you can extract it.

</div
 
 
1
 
vote

最初に、関数呼び出しとampを一致させないように、関数全体を一致させたいです。重複:

<事前> <コード> [(].*[)]16

それでは、これを分割して名前を取得します。

<事前> <コード> readOnly=true7

そしてそこに行きます!それはすべて終わってほこりした!

 

First, you'd want to match the whole function, to avoid matching function calls & duplicates:

[^s]*(([^}]*)){([^}]*)} 

Then, you want to split this up to get the name:

String matchedName = matchedFunction.split("(")[0] 

And there you go! It's all done and dusted!

</div
 
 

関連する質問

2  単語または句のインスタンスを見つけるための正規表現 - その単語やフレーズが中括弧である場合を除く  ( Regex to find instance of a word or phrase except if that word or phrase is i ) 
最初の免責事項。私は正規表現について少し知っていますが、私は専門家ではありません。彼らは私が一年に2回、私が本当に2回必要なものであるようですので、私の脳の「上に」しないでください。 状況:特定の単語を一致させるために正規表現を書いて、それを「osttric...

1  Perl:正規表現を使用してテキストからデータを抽出する  ( Perl extracting data from text using regex ) 
Perlを使用して正規表現でテキスト処理を行います。入力を制御していません。以下の入力の例をいくつか示しました。 項目BとCは、値が異なる文字列n回になることができます。私はすべての値を背面参照として取得する必要があります。それとも私はすべての耳です。 ブ...

5  DFA - >正規表現  ( Dfa regular expression ) 
私は紙にDFAを書いて、それを正規表現のセットに翻訳したいです。誰もがこれを行うための良いツールを知っていますか? ...

30  C ++で使いやすい正規表現のサポート[閉まっている]  ( Easy to use regular expression support in c ) 
この質問はスタックオーバーフローガイドラインを満たしていません。現在答えを受け付けていません。 この質問を改善したいですか? ...

1  正規表現のマッチング文字を除く  ( Excluding matching characters in regular expression ) 
私は正規表現の問題で立ち往生しています。 私は一致する必要がある文字列を持っています。文字列は常に2文字で始まり、次に6桁の数字、e.g。 EF123456 AB123456 しかし、無視する必要がある文字の組み合わせが1つあります。 e.g。: ...

6  PythonのReモジュールを使用して1回の急増で任意の順序付けられていないグループのセットを取得することが可能ですか?  ( Possible to retrieve an arbitrary unordered set of named groups in one swoop wit ) 
これはいくつかの問題に対してスーパーハンディーです: <事前> <コード> >>> re.search('(?P<b>.b.).*(?P<i>.i.)', 'abcdefghijk').groupdict() {'i': 'hij', 'b': 'abc'} ...

11  木構造のための正規表現?  ( Regex for tree structures ) 
ツリー構造を検索して変更するための正規表現はありますか?簡潔なミニ言語(Perl Regexなど)が私が探しているものです。 これは私が探しているものを明確にするかもしれない例です。 <事前> <コード> <root> <node name="1"> ...

59  PREG_REPLACEをPHPで使用するときは、一致する方法がありますか?  ( How can i get at the matches when using preg replace in php ) 
私は単語の大文字をつかみ、それらをスパンタグで包み込もうとしています。 preg_replace を使用していますが、抽出目的では何も出力していません。 。 <事前> <コード> preg_replace("/[A-Z]/", "<span class="i...

49  正規表現:文字列内の2つのタグ間のサブストリングを引き出す  ( Regex to pull out a sub string between two tags in a string ) 
私は次の形式でファイルを持っています: <前> データデータ データ [始める] データ私が欲しいデータ [終わり] データ <コード> [Start] [End] タグの間から Data I want を正規表現を使用してつかみたいと思います。誰かが...

2  括弧で囲まれていないC#コードにすべてのIFステートメントを見つけたいです。正規表現を通して  ( I want to find all if statements in c sharp code which are not followed by brack ) 
すべての if ステートメントと for ステートメントを見つけたいと思います。 if ステートメントに1行を書くと、ほとんどカーリーブラケットに囲まれているため、それらすべての if および for ステートメント。 助けてください! この文をキャプチャし...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有