Frage

Ich brauche eine Regex, die eine Java-Methode Erklärung übereinstimmen. Ich habe mit einer kommen, die eine Methode Erklärung übereinstimmen, aber es erfordert die öffnende Klammer des Verfahrens auf der gleichen Linie wie die Erklärung zu sein. Wenn Sie Vorschläge haben, um meine regex zu verbessern oder einfach ein besseres haben, dann senden Sie uns bitte eine Antwort.

Hier ist mein regex: "\w+ +\w+ *\(.*\) *\{"

Für diejenigen, die nicht wissen, was eine Java-Methode sieht aus wie ich liefern werde ein grundlegender ein:

int foo()
{

}

Es gibt mehrere optionale Teile zu Java-Methoden, die auch hinzugefügt werden können, aber das sind die einzigen Teile, die ein Verfahren haben, gewährleistet ist.

Update: Mein aktueller Regex ist "\w+ +\w+ *\([^\)]*\) *\{", um die Situation zu vermeiden, Mike und ADKOM beschrieben.

War es hilfreich?

Lösung

Haben Sie darüber nachgedacht, die tatsächlich mögliche Keywords passend? wie zum Beispiel:

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

Es ist vielleicht ein bisschen eher richtig passen, obwohl es könnte auch den Regex schwieriger zu lesen ...

Andere Tipps

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

Ich denke, dass die oben regexp fast alle möglichen Kombinationen von Java-Methode Erklärungen entsprechen können, auch jene mit Generika und Arrays sind Rückkehr Argumente, die die regexp vom ursprünglichen Autor selbst nicht entsprechen.

Nach dem durch die anderen Antworten suchen, hier ist das, was ich kam mit:

#permission
   ^[ \t]*(?:(?:public|protected|private)\s+)?
#keywords
   (?:(static|final|native|synchronized|abstract|threadsafe|transient|{#insert zJRgx123GenericsNotInGroup})\s+){0,}
#return type
   #If return type is "return" then it's actually a 'return funcName();' line. Ignore.
   (?!return)
   \b([\w.]+)\b(?:|{#insert zJRgx123GenericsNotInGroup})((?:\[\]){0,})\s+
#function name
   \b\w+\b\s*
#parameters
   \(
      #one
         \s*(?:\b([\w.]+)\b(?:|{#insert zJRgx123GenericsNotInGroup})((?:\[\]){0,})(\.\.\.)?\s+(\w+)\b(?![>\[])
      #two and up
         \(\s*(?:,\s+\b([\w.]+)\b(?:|{#insert zJRgx123GenericsNotInGroup})((?:\[\]){0,})(\.\.\.)?\s+(\w+)\b(?![>\[])\s*){0,})?\s*
   \)
#post parameters
   (?:\s*throws [\w.]+(\s*,\s*[\w.]+))?
#close-curly (concrete) or semi-colon (abstract)
   \s*(?:\{|;)[ \t]*$

Wo {#insert zJRgx123GenericsNotInGroup} gleich

`(?:<[?\w\[\] ,.&]+>)|(?:<[^<]*<[?\w\[\] ,.&]+>[^>]*>)|(?:<[^<]*<[^<]*<[?\w\[\] ,.&]+>[^>]*>[^>]*>)`

Einschränkungen:

  • kann ein beliebiger Parameter ein Auslassungszeichen haben: "..." (Java erlaubt nur letzte)
  • Drei Ebenen von verschachtelten Generika höchstens: (<...<...<...>...>...> in Ordnung, <...<...<...<...>...>...>...> schlecht). Die Syntax innerhalb Generika kann sehr unecht sein und scheint immer noch in Ordnung zu dieser regex.
  • Benötigt keine Leerzeichen zwischen den Typen und deren (optional) Öffnen Generika '<'
  • erkennt innere Klassen, aber nicht daran hindert, zwei Punkte nebeneinander, wie Klasse .... Innerclass

Im Folgenden finden Sie den rohe Phrase Code (Auto-Text und Beschreibung auf der Linie 1, Körper auf Linie 2). Rufen Sie {#insert zJRgxJavaFuncSigThrSemicOrOpnCrly}, und Sie erhalten diese:

^[ \t]*(?:(?:public|protected|private)\s+)?(?:(static|final|native|synchronized|abstract|threadsafe|transient|(?:<[?\w\[\] ,&]+>)|(?:<[^<]*<[?\w\[\] ,&]+>[^>]*>)|(?:<[^<]*<[^<]*<[?\w\[\] ,&]+>[^>]*>[^>]*>))\s+){0,}(?!return)\b([\w.]+)\b(?:|(?:<[?\w\[\] ,&]+>)|(?:<[^<]*<[?\w\[\] ,&]+>[^>]*>)|(?:<[^<]*<[^<]*<[?\w\[\] ,&]+>[^>]*>[^>]*>))((?:\[\]){0,})\s+\b\w+\b\s*\(\s*(?:\b([\w.]+)\b(?:|(?:<[?\w\[\] ,&]+>)|(?:<[^<]*<[?\w\[\] ,&]+>[^>]*>)|(?:<[^<]*<[^<]*<[?\w\[\] ,&]+>[^>]*>[^>]*>))((?:\[\]){0,})(\.\.\.)?\s+(\w+)\b(?![>\[])\s*(?:,\s+\b([\w.]+)\b(?:|(?:<[?\w\[\] ,&]+>)|(?:<[^<]*<[?\w\[\] ,&]+>[^>]*>)|(?:<[^<]*<[^<]*<[?\w\[\] ,&]+>[^>]*>[^>]*>))((?:\[\]){0,})(\.\.\.)?\s+(\w+)\b(?![>\[])\s*){0,})?\s*\)(?:\s*throws [\w.]+(\s*,\s*[\w.]+))?\s*(?:\{|;)[ \t]*$

Raw Code:

zJRgx123GenericsNotInGroup -- To precede return-type    (?:<[?\w\[\] ,.&]+>)|(?:<[^<]*<[?\w\[\] ,.&]+>[^>]*>)|(?:<[^<]*<[^<]*<[?\w\[\] ,.&]+>[^>]*>[^>]*>)  zJRgx123GenericsNotInGroup
zJRgx0OrMoreParams  \s*(?:{#insert zJRgxParamTypeName}\s*(?:,\s+{#insert zJRgxParamTypeName}\s*){0,})?\s*   zJRgx0OrMoreParams
zJRgxJavaFuncNmThrClsPrn_M_fnm -- Needs zvFOBJ_NAME (?<=\s)\b{#insert zvFOBJ_NAME}{#insert zzJRgxPostFuncNmThrClsPrn}   zJRgxJavaFuncNmThrClsPrn_M_fnm
zJRgxJavaFuncSigThrSemicOrOpnCrly -(**)-    {#insert zzJRgxJavaFuncSigPreFuncName}\w+{#insert zzJRgxJavaFuncSigPostFuncName}    zJRgxJavaFuncSigThrSemicOrOpnCrly
zJRgxJavaFuncSigThrSemicOrOpnCrly_M_fnm -- Needs zvFOBJ_NAME    {#insert zzJRgxJavaFuncSigPreFuncName}{#insert zvFOBJ_NAME}{#insert zzJRgxJavaFuncSigPostFuncName}  zJRgxJavaFuncSigThrSemicOrOpnCrly_M_fnm
zJRgxOptKeywordsBtwScopeAndRetType  (?:(static|final|native|synchronized|abstract|threadsafe|transient|{#insert zJRgx123GenericsNotInGroup})\s+){0,}    zJRgxOptKeywordsBtwScopeAndRetType
zJRgxOptionalPubProtPriv    (?:(?:public|protected|private)\s+)?    zJRgxOptionalPubProtPriv
zJRgxParamTypeName -(**)- Ends w/ '\b(?![>\[])' to NOT find <? 'extends XClass'> or ...[]>  (*Original: zJRgxParamTypeName, Needed by: zJRgxParamTypeName[4FQPTV,ForDel[NmsOnly,Types]]*){#insert zJRgxTypeW0123GenericsArry}(\.\.\.)?\s+(\w+)\b(?![>\[])   zJRgxParamTypeName
zJRgxTypeW0123GenericsArry -- Grp1=Type, Grp2='[]', if any  \b([\w.]+)\b(?:|{#insert zJRgx123GenericsNotInGroup})((?:\[\]){0,}) zJRgxTypeW0123GenericsArry
zvTTL_PRMS_stL1c    {#insert zCutL1c}{#SETPHRASE -description zvTTL_PRMS -content {#INSERTCLIPBOARD} -autotext zvTTL_PRMS -folder ctvv_folder}  zvTTL_PRMS_stL1c
zvTTL_PRMS_stL1cSvRstrCB    {#insert zvCB_CONTENTS_stCB}{#insert zvTTL_PRMS_stL1c}{#insert zSetCBToCB_CONTENTS} zvTTL_PRMS_stL1cSvRstrCB
zvTTL_PRMS_stPrompt {#SETPHRASE -description zvTTL_PRMS -content {#INPUT -head How many parameters? -single} -autotext zvTTL_PRMS -folder ctvv_folder}  zvTTL_PRMS_stPrompt
zzJRgxJavaFuncNmThrClsPrn_M_fnmTtlp -- Needs zvFOBJ_NAME, zvTTL_PRMS    (?<=[ \t])\b{#insert zvFOBJ_NAME}\b\s*\(\s*{#insert {#COND -if {#insert zvTTL_PRMS} = 0 -then z1slp -else zzParamsGT0_M_ttlp}}\)    zzJRgxJavaFuncNmThrClsPrn_M_fnmTtlp
zzJRgxJavaFuncSigPostFuncName   {#insert zzJRgxPostFuncNmThrClsPrn}(?:\s*throws \b(?:[\w.]+)\b(\s*,\s*\b(?:[\w.]+)\b))?\s*(?:\{|;)[ \t]*$   zzJRgxJavaFuncSigPostFuncName
zzJRgxJavaFuncSigPreFuncName    (*If a type has generics, there may be no spaces between it and the first open '<', also requires generics with three nestings at the most (<...<...<...>...>...> okay, <...<...<...<...>...>...>...> not)*)^[ \t]*{#insert zJRgxOptionalPubProtPriv}{#insert zJRgxOptKeywordsBtwScopeAndRetType}(*To prevent 'return funcName();' from being recognized:*)(?!return){#insert zJRgxTypeW0123GenericsArry}\s+\b  zzJRgxJavaFuncSigPreFuncName
zzJRgxPostFuncNmThrClsPrn   \b\s*\({#insert zJRgx0OrMoreParams}\)   zzJRgxPostFuncNmThrClsPrn
zzParamsGT0_M_ttlp -- Needs zvTTL_PRMS  {#insert zJRgxParamTypeName}\s*{#insert {#COND -if {#insert zvTTL_PRMS} = 1 -then z1slp -else zzParamsGT1_M_ttlp}}  zzParamsGT0_M_ttlp
zzParamsGT1_M_ttlp  {#LOOP ,\s+{#insert zJRgxParamTypeName}\s* -count {#CALC {#insert zvTTL_PRMS} - 1 -round 0 -thousands none}}    zzParamsGT1_M_ttlp

ich auch so einen regulären Ausdruck benötigen und kam mit dieser Lösung:

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

Die Grammatik und Georgios Gousios Antwort nützlich gewesen das bauen regex.

Ich bin mir ziemlich sicher, dass Java Regex-Engine standardmäßig gierig ist, was bedeutet, dass "\w+ +\w+ *\(.*\) *\{" nie übereinstimmen, da die .* in der Klammer alles nach der Öffnung paren essen. Ich empfehle Ihnen, die .* ersetzen mit [^)], auf diese Weise, Sie werden es alle Nicht-Schließen-paren Zeichen wählen.

Hinweis: Mike Stone korrigierte mich in den Kommentaren, und da die meisten Menschen nicht wirklich die Kommentare öffnen (ich weiß, dass ich nicht bemerken sie häufig):

  

Greedy bedeutet nicht, es wird nie passen ... aber es wird Pars essen, wenn es mehr Pars sind nach dem Rest der Regex zu befriedigen ... so zum Beispiel „public void foo (int arg) {if ( Test) {System.exit (0);}}“nicht richtig passen wird ...

Ich kam mit dieser:

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

ich es gegen eine PHP-Funktion getestet, aber es sollte nur die gleiche Arbeit, das ist der Code-Snippet ich verwenden:

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

MEHR INFO:

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

Ein Tipp:

Wenn Sie die Regex in Perl schreiben wollen, bitte die „xms“ Optionen verwenden, so dass Sie Räume und die Regex dokumentieren lassen. Zum Beispiel können Sie einen regulären Ausdruck wie schreiben:

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

Eine der Optionen (man denke x) die # Kommentare in einem regulären Ausdruck ermöglicht. Verwenden Sie auch \ statt einer „“ s. \ S steht für eine beliebige „blank“ Charakter. So würde Tabs auch passen - das ist, was Sie wollen. In Perl brauchen Sie nicht zu verwenden / /, können Sie {} oder <> oder | |.

Nicht sicher, ob andere Sprachen haben diese Fähigkeit. Wenn sie das tun, dann bitten sie verwenden.

(public|private|static|protected|abstract|native|synchronized) +([a-zA-Z0-9<>._?, ]+) +([a-zA-Z0-9_]+) *\\([a-zA-Z0-9<>\\[\\]._?, \n]*\\) *([a-zA-Z0-9_ ,\n]*) *\\{

Die Regex oben wird alle möglichen Java-Methodendefinitionen erkennen. Getestet auf viel von Quellcode-Dateien. So schließen Konstrukteure verwenden als auch den unter regex:

(public|private|static|protected|abstract|native|synchronized) +([a-zA-Z0-9<>._?, ]*) +([a-zA-Z0-9_]+) *\\([a-zA-Z0-9<>\\[\\]._?, \n]*\\) *([a-zA-Z0-9_ ,\n]*) *\\{

Damit wird der Name der Methode wählen nicht die ganze Linie.

(?<=public static void )\w+|(?<=private static void )\w+|(?<=protected static void )\w+|(?<=public void )\w+|(?<=private void )\w+|(?<=protected void )\w+|(?<=public final void)\w+|(?<=private final void)\w+|(?<=protected final void)\w+|(?<=private void )\w+|(?<=protected void )\w+|(?<=public static final void )\w+|(?<=private static final void )\w+|(?<=public final static void )\w+|(?<=protected final static void )\\w+|(?<=private final static void )\w+|(?<=protected final static void )\w+|(?<=void )\w+|(?<=private static )\w+

ich vim regex gebaut, dies zu tun für ctrlp / flippige basierend auf Georgios Gousios Antwort.

    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

Ich würde vermuten, dass, wie dies in Java aussieht:

^\s+(?:<\w+>\s+){0,3}(?:[\w\<\>\[\]])+\s+\w+\s*\([^\)]*\)(?:\w|\s|\{)+$

Dies ist ein speziellere Anwendungsfall, aber es ist so viel einfacher, ich seinen Wert Sharing glauben. Ich tat dies für ‚public static void‘ Methoden zu finden, das heißt Controller-Aktionen spielen, und ich habe es aus der Windows / Cygwin Befehlszeile mit grep; siehe: https://stackoverflow.com/a/7167115/34806

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

Die letzten beiden Einträge aus meiner Ausgabe sind wie folgt:

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) {

fand ich seba229 's Antwort nützlich, es fängt den meisten Szenarien, aber nicht die folgenden,

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

Diese Regex erfassen wird, dass auch.

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

Hope, das hilft.

(public|private|static|protected) ([A-Za-z0-9<>.]+) ([A-Za-z0-9]+)\(

Auch hier ist eine ersetzen Sequenz, die Sie in IntelliJ verwenden können,

$1 $2 $3(

Ich benutze es wie folgt aus:

$1 $2 aaa$3(

, wenn Java-Dateien zu konvertieren Kotlin Funktionen zu verhindern, die mit „get“ startet automatisch in Variablen drehen. Nicht mit „default“ Zugriffsebene arbeiten, aber ich nicht so viel selbst.

Wie von git 2.19.0, die gebaut -in regexp für Java jetzt scheint gut zu funktionieren, so dass Sie Ihre eigene Versorgung möglicherweise nicht erforderlich.

"!^[ \t]*(catch|do|for|if|instanceof|new|return|switch|throw|while)\n"
"^[ \t]*(([A-Za-z_][A-Za-z_0-9]*[ \t]+)+[A-Za-z_][A-Za-z_0-9]*[ \t]*\\([^;]*)$"

(die erste Zeile scheint zum Ausfiltern von Linien zu sein, das Verfahren Erklärungen ähneln, aber ist es nicht.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top