質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

1回答

2986閲覧

Java 正規表現

Matt

総合スコア41

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2016/10/12 14:29

編集2016/10/13 02:55

###前提・実現したいこと
JavaでコードをString型で読み込み、PatternとMatcherを使ってそのソースコード内で定義されたreturnを持つメソッド名を取得するプログラムを作成しています。
正規表現でメソッド名を取得できるようにしたいです。

例)
・メソッド名を取得するメソッド
/**
* メソッド名の取り出し
* @param code ソースコード
* @return methodList メソッド名のリスト
*/
public static ArrayList<String> getCheckMethod(String code){
String word2 = "正規表現";
Pattern p = Pattern.compile(word2);
Matcher m = p.matcher(code);

ArrayList<String> methodList = new ArrayList<String>(); while(m.find()){ String methodName = m.group().toString(); methodList.add(methodName); } System.out.println(methodList); return methodList; }

・読み込んだString型のJavaコード
public class Test {
public static String HelloMsg(){
String msg = "Hello";
return msg;
}
public static String morningMsg(){
return "Goodmornig!";
}
}

・取得したい部分
HelloMsg, morningMsg

###発生している問題・エラーメッセージ
現段階として、まず上の例で
[ static String HelloMsg(){
String msg = "Hello";
return,static String morningMsg(){
return]
までを取得する正規表現を考えているのですが、うまくいきません。
※[,]はArrayListの標準出力

###試したこと
code: String型のJavaコード
word2: 正規表現
word2の値で試した方法
1.「 .\(.\)\s*\{[\S\s]*return」
・標準出力の結果
[ static String HelloMsg(){
String msg = "Hello";
return msg;
}

public static String morningMsg(){ return]

・問題点
途中のreturnを飛ばして、一番最後のreturnまでを取得してしまう。

2.「 .\(.\)\s*\{[^(return)]*return」
・標準出力の結果
[ static String morningMsg(){
return]

・問題点
メソッド名の次の行にreturnがないと取得できない(HelloMsgはメソッド名の3行目にreturnが存在)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2016/10/12 15:54

どううまくいかないのですか?
Matt

2016/10/13 02:57

より詳細が分かるように質問を変更しました、よろしくお願いします。
A-pZ

2016/10/13 07:32

"ソースコード内で定義されたreturnを持つメソッド名を取得する"がわかりにくい印象をうけましたが、単純に「メソッド名の一覧を出す」がやりたいことでしょうか。
Matt

2016/10/13 07:38

メソッド名を取り出すのが目標なので、やり方は違っていても構いません。回りくどく書いてしまい申し訳ありません
Matt

2016/10/13 07:39

「メソッド名の一覧を取り出す」がやりたいことです。
guest

回答1

0

ベストアンサー

メソッド名を取得するだけならreturnを判別する必要はないですよね?
メソッド名の定義の仕方は
[修飾子] 返り値の型 メソッド名 (仮引数リスト) {内容}
のような形になるので、このメソッド名にマッチするように正規表現を書けばいいことになります。
まず任意の単語は、「単語構成文字(正規表現で\wで表現)」を1文字以上連ねた文字列なので

java

1"\\w+"

のようになります。しかしこれではあらゆる単語を拾ってしまうため、メソッド名の後に続く(){があることを正規表現に盛り込みます。ここで使えるのが「先読み」です。

java

1"\\w+(?=\\s*\\(.*\\)\\s*\\{)"

(?=パターン)の部分は、このあとにこのパターンが続くものという意味で、パターンがあればその先頭位置にマッチします(先読みパターンがマッチした部分はマッチする文字列に含まれない)。
つまりこの正規表現で、「単語構成文字が1文字以上連続したその最長部分で、あとに任意の個数の空白文字、カッコ、任意の文字、閉じカッコ、空白文字、中カッコが続くもの」を表現できます。

この正規表現でもとのコードを読み込むと、きちんと目的の2つのメソッド名を取り出せました。
しかし、このままではインスタンスメソッド呼び出しや匿名クラス宣言にもマッチするうえ、変な書き方をされたコード(カッコの途中で改行があるなど)だとうまくいかないおそれがあるので、そのへんは工夫が必要そうです。

投稿2016/10/13 17:41

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Matt

2016/10/14 09:02

(?=パターン)や\wについて知らなかったので、助かりました。 教えていただいた正規表現をもとに、メソッドを正確に取り込めるようにしていきます。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問