문제

Java 메소드 선언과 일치하는 Regex가 필요합니다.메서드 선언과 일치하는 것을 생각해 냈지만 메서드의 여는 괄호가 선언과 같은 줄에 있어야 합니다.내 정규 표현식을 개선하기 위한 제안 사항이 있거나 더 나은 제안 사항이 있으면 답변을 제출해 주세요.

내 정규식은 다음과 같습니다. "\w+ +\w+ *\(.*\) *\{"

Java 메소드가 어떻게 생겼는지 모르는 사람들을 위해 기본적인 메소드를 제공하겠습니다.

int foo()
{

}

Java 메소드에는 추가할 수 있는 몇 가지 선택적 부분이 있지만 이는 메소드가 보장하는 유일한 부분입니다.

업데이트:내 현재 정규식은 "\w+ +\w+ *\([^\)]*\) *\{" Mike와 adkom이 설명한 상황을 방지하기 위해.

도움이 되었습니까?

해결책

실제 가능한 키워드를 일치시키는 것을 고려해 보셨나요?와 같은:

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

정규식을 읽기가 더 어려워질 수도 있지만 올바르게 일치할 가능성이 조금 더 높을 수도 있습니다.

다른 팁

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

위의 정규식은 Java 메서드 선언의 거의 모든 가능한 조합과 일치할 수 있다고 생각합니다. 제네릭과 배열을 포함하는 것조차도 반환 인수이므로 원래 작성자가 제공한 정규식과 일치하지 않습니다.

다른 답변을 살펴본 후 제가 생각해낸 내용은 다음과 같습니다.

#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]*$

어디 {#insert zJRgx123GenericsNotInGroup} 같음

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

제한사항:

  • 모든 매개변수에는 줄임표가 있을 수 있습니다."..."(Java에서는 마지막만 허용)
  • 최대 세 가지 수준의 중첩된 제네릭:(<...<...<...>...>...> 좋아요, <...<...<...<...>...>...>...> 나쁜).제네릭 내부의 구문은 매우 가짜일 수 있으며 여전히 이 정규식에는 괜찮아 보입니다.
  • 유형과 해당 (선택적) 여는 제네릭 '<' 사이에 공백이 필요하지 않습니다.
  • 내부 클래스를 인식하지만 Class....InnerClass와 같이 서로 옆에 있는 두 개의 점을 방지하지 않습니다.

다음은 원시 PhraseExpress 코드입니다(1행의 자동 텍스트 및 설명, 2행의 본문).부르다 {#insert zJRgxJavaFuncSigThrSemicOrOpnCrly}, 그리고 다음을 얻습니다:

^[ \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]*$

원시 코드:

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

나 또한 그러한 정규 표현식이 필요했고 다음과 같은 해결책을 생각해 냈습니다.

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

이것 문법 Georgios Gousios 답변은 정규식을 작성하는 데 유용했습니다.

나는 Java의 정규식 엔진이 기본적으로 탐욕적이라고 확신합니다. "\w+ +\w+ *\(.*\) *\{" 이후로 절대 일치하지 않습니다. .* 괄호 안의 괄호는 여는 괄호 뒤의 모든 것을 먹습니다.교체하시는 걸 추천드려요 .* [^)]를 사용하면 닫히지 않는 괄호 문자가 모두 선택됩니다.

메모: Mike Stone이 댓글에서 내 의견을 바로잡았는데, 대부분의 사람들이 댓글을 실제로 열지 않기 때문에(나는 종종 댓글을 눈치채지 못한다는 것을 안다):

탐욕스럽다고 절대 일치하지 않는다는 뜻은 아닙니다...하지만 나머지 정규식을 만족시키기 위해 더 많은 괄호가 있으면 괄호를 먹습니다...예를 들어 "public void foo(int arg) { if (test) { System.exit(0);} }"가 제대로 일치하지 않습니다...

나는 이것을 생각해 냈습니다 :

\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

팁:

Perl로 정규식을 작성하려면 공백을 남겨두고 정규식을 문서화할 수 있도록 "xms" 옵션을 사용하십시오.예를 들어 다음과 같은 정규식을 작성할 수 있습니다.

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

옵션 중 하나(x를 생각해 보세요)는 정규식 내부에 # 주석을 허용합니다.또한 " " 대신 \s를 사용하십시오.\s는 "공백" 문자를 나타냅니다.따라서 탭도 일치합니다. 이것이 바로 여러분이 원하는 것입니다.Perl에서는 / /를 사용할 필요가 없으며 {} 또는 <> 또는 | |.

다른 언어에도 이 기능이 있는지는 확실하지 않습니다.그렇다면 사용하시기 바랍니다.

(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]*) *\\{

위의 Regex는 가능한 모든 Java 메소드 정의를 감지합니다.많은 소스 코드 파일에서 테스트되었습니다.생성자를 포함하려면 아래 정규식도 사용하세요.

(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]*) *\\{

이것은 전체 라인이 아닌 메소드의 이름을 선택합니다.

(?<=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+

나는 이것을 수행하기 위해 vim 정규식을 만들었습니다. Ctrl/펑키 Georgios Gousios의 답변을 기반으로 합니다.

    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|\{)+$

이는 보다 구체적인 사용 사례를 위한 것이지만 훨씬 더 간단하므로 공유할 가치가 있다고 생각합니다.나는 'public static void' 메소드를 찾기 위해 이 작업을 수행했습니다.컨트롤러 작업을 재생하고 grep을 사용하여 Windows/Cygwin 명령줄에서 수행했습니다.보다: https://stackoverflow.com/a/7167115/34806

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

내 출력의 마지막 두 항목은 다음과 같습니다.

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

나는 찾았다 세바229님의 답변은 유용하며 대부분의 시나리오를 포착하지만 다음은 포착하지 않습니다.

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*

도움이 되었기를 바랍니다.

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

또한 IntelliJ에서 사용할 수 있는 교체 시퀀스는 다음과 같습니다.

$1 $2 $3(

나는 이것을 다음과 같이 사용합니다 :

$1 $2 aaa$3(

Java 파일을 Kotlin으로 변환할 때 'get'으로 시작하는 함수가 자동으로 변수로 바뀌는 것을 방지합니다."기본" 액세스 수준에서는 작동하지 않지만 나 자신은 그렇게 많이 사용하지 않습니다.

자식 2.19.0부터, Java용 내장 정규식 이제 잘 작동하는 것 같으므로 직접 제공할 필요가 없을 수도 있습니다.

"!^[ \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]*\\([^;]*)$"

(첫 번째 줄은 메서드 선언과 비슷하지만 그렇지 않은 줄을 필터링하기 위한 것 같습니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top