18

Java メソッド宣言に一致する正規表現が必要です。メソッド宣言に一致するものを思いつきましたが、メソッドの開き括弧が宣言と同じ行にある必要があります。私の正規表現を改善するための提案がある場合、または単により良いものがある場合は、回答を送信してください。

これが私の正規表現です:"\w+ +\w+ *\(.*\) *\{"

Java メソッドがどのように見えるかを知らない人のために、基本的なメソッドを提供します。

int foo()
{

}

Java メソッドには追加できるオプションの部分がいくつかありますが、メソッドが持つことが保証されているのはこれらの部分だけです。

更新: 私の現在の"\w+ +\w+ *\([^\)]*\) *\{"正規表現は、Mike と adkom が説明した状況を防ぐためのものです。

4

14 に答える 14

23
(public|protected|private|static|\s) +[\w\<\>\[\]]+\s+(\w+) *\([^\)]*\) *(\{?|[^;])

上記の正規表現は、Java メソッド宣言のほとんどすべての可能な組み合わせに一致すると思います。元の作成者によって提供された正規表現が一致しなかった、ジェネリックと配列を含むものも戻り引数です。

于 2009-05-11T10:23:14.347 に答える
7

私もそのような正規表現が必要で、この解決策を思いつきました:

(?:(?:public|private|protected|static|final|native|synchronized|abstract|transient)+\s+)+[$_\w<>\[\]\s]*\s+[\$_\w]+\([^\)]*\)?\s*\{?[^\}]*\}?

この文法と Georgios Gousios の回答は、正規表現を構築するのに役立ちました。

編集: tharindu_DG のフィードバックを考慮し、グループを非キャプチャにし、フォーマットを改善しました。

于 2013-04-20T09:42:20.850 に答える
4

実際に考えられるキーワードとのマッチングを検討しましたか? そのような:

(?:(?:public)|(?:private)|(?:static)|(?:protected)\s+)*

正規表現が読みにくくなる可能性もありますが、正しく一致する可能性が少し高くなる可能性があります...

于 2008-09-16T01:50:52.330 に答える
2

Javaの正規表現エンジンはデフォルトで貪欲であると確信しています。つまり、括弧内は開き括弧の後にすべてを食べる"\w+ +\w+ *\(.*\) *\{"ため、一致することはありません。.*を[^)]に置き換えることをお勧めします.*。これにより、すべての非クロージングパレン文字が選択されます。

注: Mike Stoneがコメントで私を修正しました。ほとんどの人はコメントを実際に開かないので(私は頻繁にコメントに気付かないことを知っています):

貪欲は、それが決して一致しないという意味ではありません...しかし、正規表現の残りを満足するために、後にさらに多くの親が存在する場合、それは親を食べます...したがって、たとえば、 "public void foo(int arg){if(test){ System.exit(0);}}"は正しく一致しません...

于 2008-09-16T01:54:17.127 に答える
2

私はこれを思いつきました:

\b\w*\s*\w*\(.*?\)\s*\{[\x21-\x7E\s]*\}

PHP関数に対してテストしましたが、まったく同じように機能するはずです。これは私が使用したコードのスニペットです:

function getProfilePic($url)
 {
    if(@open_image($url) !== FALSE)
     {
        @imagepng($image, 'images/profiles/' . $_SESSION['id'] . '.png');
        @imagedestroy($image);
        return TRUE;
     }
    else 
     {
        return FALSE;
     }
 }

より詳しい情報:

Options: case insensitive

Assert position at a word boundary «\b»
Match a single character that is a “word character” (letters, digits, etc.) «\w*»
   Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
Match a single character that is a “whitespace character” (spaces, tabs, line breaks, etc.) «\s*»
   Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
Match a single character that is a “word character” (letters, digits, etc.) «\w*»
   Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
Match the character “(” literally «\(»
Match any single character that is not a line break character «.*?»
   Between zero and unlimited times, as few times as possible, expanding as needed (lazy) «*?»
Match the character “)” literally «\)»
Match a single character that is a “whitespace character” (spaces, tabs, line breaks, etc.) «\s*»
   Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
Match the character “{” literally «\{»
Match a single character present in the list below «[\x21-\x7E\s]*»
   Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
   A character in the range between ASCII character 0x21 (33 decimal) and ASCII character 0x7E (126 decimal) «\x21-\x7E»
   A whitespace character (spaces, tabs, line breaks, etc.) «\s»
Match the character “}” literally «\}»


Created with RegexBuddy
于 2008-09-16T02:28:16.217 に答える
1

これはより具体的な使用例のためのものですが、共有する価値があると信じているほど単純です。これは、'public static void' メソッド、つまり Play コントローラー アクションを見つけるために行いました。Windows/Cygwin コマンド ラインから、grep を使用して行いました。参照: https://stackoverflow.com/a/7167115/34806

cat Foobar.java | grep -Pzo '(?s)public static void.*?\)\s+{'

出力の最後の 2 つのエントリは次のとおりです。

public static void activeWorkEventStations (String type,
            String symbol,
            String section,
            String day,
            String priority,
            @As("yyyy-MM-dd") Date scheduleDepartureDate) {
public static void getActiveScheduleChangeLogs(String type,
            String symbol,
            String section,
            String day,
            String priority,
            @As("yyyy-MM-dd") Date scheduleDepartureDate) {
于 2014-01-16T20:30:04.873 に答える
1

先端:

Perl で正規表現を作成する場合は、「xms」オプションを使用して、スペースを残して正規表現を文書化できるようにしてください。たとえば、次のような正規表現を記述できます。

 m{\w+ \s+      #return type
   \w+ \s*      #function name
   [(] [^)]* [)] #params
   \s* [{]           #open paren
  }xms

オプションの 1 つ (x と考えてください) では、正規表現内で # コメントを使用できます。また、" " の代わりに \s を使用してください。\s は任意の「空白」文字を表します。したがって、タブも一致します-これはあなたが望むものです。Perl では、/ / を使用する必要はありません。{ } または < > または | を使用できます。|。

他の言語にこの機能があるかどうかはわかりません。もしそうなら、それらを使用してください。

于 2008-09-16T05:31:29.867 に答える
0

Georgios Gousios の回答に基づいて、 ctrlp/funkyに対してこれを行うための vim 正規表現を作成しました。

    let regex = '\v^\s+'                " preamble
    let regex .= '%(<\w+>\s+){0,3}'     " visibility, static, final
    let regex .= '%(\w|[<>[\]])+\s+'    " return type
    let regex .= '\w+\s*'               " method name
    let regex .= '\([^\)]*\)'           " method parameters
    let regex .= '%(\w|\s|\{)+$'        " postamble

Java では次のようになると思います。

^\s+(?:<\w+>\s+){0,3}(?:[\w\<\>\[\]])+\s+\w+\s*\([^\)]*\)(?:\w|\s|\{)+$
于 2012-07-26T15:02:50.220 に答える
0

seba229の回答が役立つことがわかりました。ほとんどのシナリオをキャプチャしますが、次のシナリオはキャプチャしません。

public <T> T name(final Class<T> x, final T y)

この正規表現はそれもキャプチャします。

((public|private|protected|static|final|native|synchronized|abstract|transient)+\s)+[\$_\w\<\>\w\s\[\]]*\s+[\$_\w]+\([^\)]*\)?\s*

お役に立てれば。

于 2016-03-25T09:23:53.573 に答える