Regex من شأنها أن تتطابق مع جافا طريقة الإعلان

StackOverflow https://stackoverflow.com/questions/68633

  •  09-06-2019
  •  | 
  •  

سؤال

أحتاج Regex من شأنها أن تتطابق مع جافا طريقة الإعلان.وقد تأتي مع واحد من شأنها أن تتطابق مع طريقة الإعلان ، ولكن ذلك يتطلب فتح قوس الطريقة أن يكون على نفس السطر مثل الإعلان.إذا كان لديك أي اقتراحات لتحسين regex أو ببساطة يكون أفضل واحد ثم يرجى تقديم إجابة.

هنا هو بلدي regex: "\w+ +\w+ *\(.*\) *\{"

بالنسبة لأولئك الذين لا يعرفون ما طريقة جافا يبدو أنني سوف توفر واحدة أساسية:

int foo()
{

}

هناك عدة أجزاء اختيارية جافا الأساليب التي يمكن إضافتها كذلك ولكن تلك هي إلا أجزاء هذا الأسلوب هو ضمان أن يكون.

تحديث:بلدي الحالي هو Regex "\w+ +\w+ *\([^\)]*\) *\{" وذلك لمنع الحالة التي مايك adkom وصفها.

هل كانت مفيدة؟

المحلول

هل تعتبر مطابقة ممكن الفعلي الكلمات الرئيسية ؟ مثل:

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

قد يكون قليلا أكثر عرضة المباراة بشكل صحيح ، على الرغم من أنه يمكن أيضا جعل regex الصعب قراءة...

نصائح أخرى

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

أعتقد أن ما سبق regexp يمكن أن تتطابق تقريبا كل مزيج ممكن من طريقة جافا الإعلانات ، حتى أولئك بما في ذلك الأدوية و المصفوفات هي عودة الحجج التي regexp المقدمة من قبل المؤلف الأصلي لم يطابق.

بعد النظر من خلال إجابات أخرى, هنا هو ما جئت به:

#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\[\] ,.&]+>[^>]*>[^>]*>)`

القيود:

  • أي معلمة يمكن أن يكون القطع:"..." (جافا يسمح الماضي فقط)
  • ثلاثة مستويات متداخلة الأدوية على الأكثر:(<...<...<...>...>...> حسنا ، <...<...<...<...>...>...>...> سيئة).الجملة داخل الوراثة يمكن أن تكون وهمية ، لا يزال يبدو حسنا هذا regex.
  • لا يتطلب أي مسافات بين أنواع و (اختياري) فتح الأدوية '<'
  • تسلم الطبقات الداخلية ، ولكن لا يمنع اثنين من النقاط بجانب بعضها البعض ، مثل فئة....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*\\{?[^\\}]*\\}?"

هذا قواعد اللغة و جورجيوس Gousios إجابة مفيدة لبناء regex.

أنا متأكد جافا regex المحرك هو الجشع بشكل افتراضي ، وهذا يعني أن "\w+ +\w+ *\(.*\) *\{" لن المباراة منذ .* داخل قوسين سوف يأكل كل شيء بعد افتتاح paren.أنصحك محل .* مع [ ^ )] هذه طريقة أنه سيتم تحديد كل شيء غير إغلاق-paren الشخصيات.

ملاحظة: مايك ستون تصحيح لي في التعليقات ، وبما أن معظم الناس لا حقا فتح التعليقات (وأنا أعلم أنني في كثير من الأحيان لا تلاحظ لهم):

الجشع لا يعني أنها سوف تتطابق أبدا...ولكن سوف تأكل parens إذا كان هناك أكثر parens بعد استيفاء بقية regex...لذلك على سبيل المثال "الفراغ العام فو(الباحث arg) { if (اختبار) { 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

نصيحة:

إذا كنت تنوي كتابة التعابير المنطقية في بيرل ، يرجى استخدام "xms" الخيارات بحيث يمكنك ترك المساحات وتوثيق regex.على سبيل المثال يمكنك كتابة التعابير المنطقية مثل:

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

واحد من الخيارات (اعتقد x) يسمح # تعليقات داخل regex.أيضا استخدام \s بدلا من " ".\s تقف على أي "فارغة" الطابع.حتى علامات التبويب أيضا المباراة التي كنت تريد.في بيرل أنت لا تحتاج إلى استخدام / /, يمكنك استخدام { } أو < > أو | |.

لست متأكدا إذا لغات أخرى لديها هذه القدرة.إذا فعلوا ذلك, ثم الرجاء استخدام لهم.

(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 أعلاه سيتم الكشف عن كل شيء ممكن طريقة جافا التعاريف.اختبار على الكثير من ملفات التعليمات البرمجية المصدر.لتشمل منشئات وكذلك استخدام أدناه 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]*) *\\{

هذا وسوف تختار اسم الأسلوب ليس كل خط.

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

لقد بنيت همة regex أن تفعل هذا ctrlp/غير تقليدي على أساس جورجيوس 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

أعتقد أن يبدو مثل هذا في جاوة:

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

هذا هو أكثر تحديدا حالة استخدام ولكن الأمر أبسط من ذلك بكثير وأعتقد أنه يستحق المشاركة.فعلت هذا من أجل إيجاد العامة ساكنة باطلة' أساليب أياللعب تحكم تصرفات و أنا فعلت هذا من نوافذ/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) {

وجدت seba229's إجابة مفيدة ، فإنه يلتقط معظم السيناريوهات ، ولكن ليس التالية ،

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

هذا regex القبض أيضا.

((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(

عند تحويل ملفات جافا إلى Kotlin لمنع الوظائف التي تبدأ مع "على" من تحول تلقائيا إلى المتغيرات.لا يعمل مع "الافتراضي" الوصول إلى المستوى لكن لا يستخدم الكثير من نفسي.

كما من بوابة ل2. 19. 0 ، المدمج في regexp جافا الآن يبدو للعمل بشكل جيد ، لذلك توريد الخاصة بك قد لا يكون ضروريا.

"!^[ \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