آموزش کامل عبارات منظم در جاوا

آموزش کامل عبارات منظم در جاوا
مرداد ۱۵, ۱۳۹۸ No Comments javascript زهرا ابراهیمی

جاوا برای تطابق الگو با عبارات منظم پکیج java.util.regex را فراهم می‌کند. عبارات منظم جاوا بسیار شبیه به زبان برنامه‌نویسی پرل و یادگیری آن‌ها بسیار آسان است.

عبارات منظم یک دنباله خاصی از کاراکترها هستند که به شما کمک می‌کنند تا رشته‌ها یا مجموعه‌هایی از رشته‌های ترکیب‌شده و یا یک دستورالعمل خاص استفاده‌شده در یک الگو را پیدا کنید. آن‌ها می‌توانند برای جستجو، ویرایش و یا دست‌کاری متن و داده‌ها مورداستفاده قرار گیرند.

پکیج java.util.regex عمدتاً از سه کلاس زیر تشکیل‌شده است:

  • کلاس الگو – آبجکت الگو یک نمایش کامپایل شده از یک عبارت منظم است. کلاس الگو ساخت‌وسازهای عمومی را فراهم نمی‌کند. برای ایجاد یک الگو، ابتدا باید یکی از روش‌های استاتیک عمومی ()compile را فراخوانی کنید که سپس یک موضوع الگو را برگرداند. این روش‌ها، آرگومان یک عبارت منظم را به‌عنوان اولین می‌پذیرند.
  • کلاس matcher – موضوع matcher یک موتور است که الگوریتم را تفسیر می‌کند و عملیات تطبیق در برابر یک‌رشته ورودی را انجام می‌دهد. مانند کلاس الگو، Matcher هیچ سازنده‌های عمومی را تعریف نمی‌کند. با فراخانی روش ()matcher در موضوع الگو شما می‌توانید موضوع Matcher را به دست می‌آورید.
  • PatternSyntaxException – موضوع PatternSyntaxException یک استثناء بدون کنترل است که یک خطای نحوی را در یک الگوی عبارات منظم نشان می‌دهد.

گرفتن گروه‌ها چگونه انجام می‌شود؟

گرفتن گروه، یک‌راه مربوط به کاراکترهای چندگانه به‌عنوان یک واحد است. آن‌ها با قرار دادن کاراکترها در داخل مجموعه‌ای از پرانتزها گروه‌بندی می‌شوند. به‌عنوان‌مثال، عبارات منظم (سگ) با استفاده از یک گروه واحد با حروف d””، o”” و “g” ایجاد می‌شود.

گرفتن گروه با شمارش پرانتز باز خود از سمت چپ به راست شمارش می‌شوند. به‌عنوان‌مثال، در عبارت ((A) (B (C)))، چهار گروه وجود دارد

  • ((A) (B (C)))
  • (A)
  • (B(C))
  • (C)

برای پیدا کردن چند گروه در عبارت، روش groupCount را در یک موضوع matcher را فراخوانی کنید. روش groupCount int،  تعداد گروه‌های ضبط‌شده موجود در الگوی matcher را نشان می‌دهد.

همچنین یک گروه خاص به‌صورت گروه ۰ وجود دارد که همیشه کل عبارت را نشان می‌دهد. این گروه درمجموع گزارش‌شده توسط گروه Count قرار ندارد.

مثال

مثال زیر نشان می‌دهد که چگونه رشته اعداد دیجیتال یک‌رشته الفبایی داده‌شده را پیدا کنیم

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class RegexMatches {

   public static void main( String args[] ) {

      // String to be scanned to find the pattern.

      String line = “This order was placed for QT3000! OK?”;

      String pattern = “(.*)(\\d+)(.*)”;

      // Create a Pattern object

      Pattern r = Pattern.compile(pattern);

      // Now create matcher object.

      Matcher m = r.matcher(line);

      if (m.find( )) {

         System.out.println(“Found value: ” + m.group(0) );

         System.out.println(“Found value: ” + m.group(1) );

         System.out.println(“Found value: ” + m.group(2) );

      }else {

         System.out.println(“NO MATCH”);

      }

   }

}

نتیجه به‌صورت زیر خواهد بود

خروجی

Found value: This order was placed for QT3000! OK?

Found value: This order was placed for QT300

Found value: 0

دستور زبان عبارات منظم

در ادامه جدولی آمده است که همه‌ی اصطلاحات مربوط به عبارات منظم متاکاراکتر در جاوا را توضیح داده است.

 

Subexpressionتطبیق‌ها
^آغاز خط را مطابقت می‌دهد
$پایان خط را مطابقت می‌دهد
.هر کاراکتری به جز خط جدید را مطابقت می‌دهد. با استفاده از گزینه m امکان مطابقت را به خط جدید هم می‌دهد.
[…]هر کاراکتری را در براکت ها مطابقت می‌دهد.
[^…]هر کاراکتری را که در براکت نیست، مطابقت می‌دهد.
\Aشروع تمام رشته‌ها
\zپایان تمام رشته‌ها
\Zپایان تمام رشته‌ها ، به جز محدودکننده خط مجاز.
re*۰ یا رخداد بیشتر را با عبارت قبل مطابقت می‌دهد
re+۱ یا بیشتر را با عبارت قبل مطابقت می‌دهد
re?۰ یا ۱ رخداد را با عبارت قبل مطابقت می‌دهد
re{ n}تعداد دقیق n رخداد را با عبارت قبل مطابقت می‌دهد
re{ n,}تعداد n و یا بیشتر رخداد را با عبارت قبل مطابقت می‌دهد
re{ n, m}تعداد حداقل n و حداکثر m رخداد را با عبارت قبل مطابقت می‌دهد
a| bیکی از دو مقدار a یا b را مطابقت می‌دهد.
(re)عبارات منظم گروه‌ها و متن متناظر را به یاد می‌آورد.
(?: re)عبارات منظم گروهی بدون یادآوری متن متناسب.
(?> re)الگوی مستقل بدون یادآوری انطباق را مطابقت می‌دهد.
\wکاراکترهای کلمه را مطابقت می‌دهد.
\Wکاراکترهای غیر کلمه‌ای را مطابقت می‌دهد.
\sفضای سفید را مطابقت می‌دهد و معادل با [\ t \ n \ r \ f] است.
\Sفضای غیر سفید را مطابقت می‌دهد.
\dرقم‌ها را مطابقت می‌دهد. معادل با [۰-۹] است.
\Dغیر رقم را مطابقت می‌دهد
\Aآغاز رشته را مطابقت می‌دهد.
\Zپایان رشته را مطابقت می‌دهد. اگر یک خط جدید وجود داشته باشد، درست قبل از خط جدید را مطابقت می‌دهد.
\zپایان رشته را مطابقت می‌دهد.
\Gنقطه‌ای تطابق پایان می‌یابد را تطبیق می‌دهد
\nبرای گرفتن شماره گروه “n” به مرجع بازمی‌گردند.
\bمرز کلمات را در خارج پرانتز مطابقت می‌دهد. وقتی‌که درون پرانتز باشد، بدون فاصله (۰x08) مطابقت می‌دهد.
\Bمرزهای غیر کلمات را مطابقت می‌دهد.
\n, \t, etc.خط جدید، بازگشت به قبل و پنجره‌ها و غیره را مطابقت می‌دهد.
\Qخروج (نقل‌قول) تمام کاراکترها تا E \.
\Eپایان نقل‌قول باQ  \ آغازشده است.

روش‌های کلاس matcher

در ادامه یک لیست کاربردی از روش‌های نمونه ارائه می‌گردد. پس ما همراه باشید.

روش‌های شاخص

روش‌های شاخص مقادیر شاخص مفید را به‌صورت معین که با رشته ورودی مطابقت دارد را فراهم می‌کند.

 

ردیفروش و توضیحات
۱public int start()

شاخص آغازگر  مطابقت قبل را برمی‌گرداند

۲public int start(int group)

شاخص آغازگر که توسط گروه داده‌شده در طی عملیات تطابق قبل برمی‌گردد

۳public int end()

بعد از آخرین کاراکتر تطبیق یافته انحراف را برمی‌گرداند.

۴public int end(int group)

بعد از آخرین کاراکتر متعاقب ضبط‌شده توسط گروه داده‌شده در طول عملیات تطابق قبلی ،انحراف را برمی‌گرداند.

 

مقادیر مفید روش‌های شاخص دقیقاً نشان می‌دهد که تطابق در کجای رشته ورودی یافت می‌شود؟

روش‌های مطالعه

روش‌های مطالعه رشته ورودی را بررسی می‌کند و جواب را به‌صورت یک بولی برمی‌گرداند که نشان می‌دهد آیا الگو یافت می‌شود یا خیر؟

 

ردیفروش و توضیحات
۱public boolean lookingAt()

تلاش برای مطابقت با توالی ورودی و شروع از آغاز منطقه که متضاد با الگو است.

۲public boolean find()

لاش برای پیدا کردن دنباله بعدی توالی ورودی است که منطبق با الگو است.

۳public boolean find(int start)

matcher را بازنشانی می‌کند و سپس به دنبال دنباله بعدی توالی ورودی می‌آید که با الگویی که مشخص‌شده است، مطابقت دارد.

۴public boolean matches()

تلاش برای مطابقت با کل منطقه که در تضاد با الگو است.

روش‌های جایگزین

روش‌های جایگزین روش‌های مفید برای جایگزینی متن در یک‌رشته ورودی هستند.

 

ردیفروش و توضیحات
۱public Matcher appendReplacement(StringBuffer sb, String replacement)

گام افزودن و جایگزینی بدون ترمینال را اجرا می‌کند.

۲public StringBuffer appendTail(StringBuffer sb)

یک ترمینال افزودن و جایگزینی را اجرا می‌کند.

۳public String replaceAll(String replacement)

هر دنباله‌ای از توالی ورودی که منطبق با الگوی با رشته جایگزین می‌کند.

۴public String replaceFirst(String replacement)

اولین دنباله از توالی ورودی که تطابق با الگوی رشته جایگزینی داده‌شده را جایگزین می‌کند.

۵public static String quoteReplacement(String s)

یک جایگزینی واقعی را برای رشته انتخاب‌شده برمی‌گرداند. ین روش یک‌رشته ایجاد می‌کند که به‌عنوان جایگزین کننده خطای روش  appendReplacement از کلاس Matcher عمل می‌کند.

 

روش‌های شروع و پایان

در زیر نمونه‌ای آمده است که تعداد دفعاتی که کلمه “گربه” در رشته ورودی نمایش داده می‌شود را شمارش می‌کند

مثال

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class RegexMatches {

   private static final String REGEX = “\\bcat\\b”;

   private static final String INPUT = “cat cat cat cattie cat”;

   public static void main( String args[] ) {

      Pattern p = Pattern.compile(REGEX);

      Matcher m = p.matcher(INPUT);   // get a matcher object

      int count = 0;

      while(m.find()) {

         count++;

         System.out.println(“Match number “+count);

         System.out.println(“start(): “+m.start());

         System.out.println(“end(): “+m.end());

      }

   }

}

نتیجه به‌صورت زیر است

خروجی

Match number 1

start(): 0

end(): 3

Match number 2

start(): 4

end(): 7

Match number 3

start(): 8

end(): 11

Match number 4

start(): 19

end(): 22

شما می‌توانید ببینید که این مثال از مرزهای کلمه استفاده می‌کند تا اطمینان حاصل شود که حروف “c””a””t” صرفاً یک زیرشاخه در یک کلمه طولانی‌تر نیستند. این همچنین اطلاعات مفیدی در مورد اینکه در کجای رشته ورودی تطابق رخ‌داده است را به ما می‌دهد.

روش شروع، شاخص آغازگری که از توالی داده‌شده توسط گروه در طول عملیات تطابق قبل ثبت‌شده است، بازمی‌گرداند و شاخص پایان کاراکتر مطابق با آخرین تطابق را با یک جمع می‌کند.

روش‌های تطابق و lookingAt

هردوی این روش‌ها برای تطابق یک توالی ورودی را با یک الگوریتم به کار می‌روند. فقط یک تفاوت میان این روش‌ها وجود دارد که در روش تطابق نیاز به توالی کامل ورودی است درحالی‌که روش lookingAt این‌گونه نیست.

هر دو روش همیشه آغازگر در ابتدای رشته ورودی قرار دارد. با ما همراه باشید تا با ارائه یک مثال توضیحات را کامل کنیم.

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class RegexMatches {

   private static final String REGEX = “foo”;

   private static final String INPUT = “fooooooooooooooooo”;

   private static Pattern pattern;

   private static Matcher matcher;

   public static void main( String args[] ) {

      pattern = Pattern.compile(REGEX);

      matcher = pattern.matcher(INPUT);

      System.out.println(“Current REGEX is: “+REGEX);

      System.out.println(“Current INPUT is: “+INPUT);

      System.out.println(“lookingAt(): “+matcher.lookingAt());

      System.out.println(“matches(): “+matcher.matches());

   }

}

نتیجه به‌صورت زیر خواهد شد

خروجی

Current REGEX is: foo

Current INPUT is: fooooooooooooooooo

lookingAt(): true

matches(): false

روشهایreplaceFirst و replaceAll

متنی که با عبارتی منظم داده‌شده مطابقت دارد را جایگزین می‌کند. همان‌طور که از نام این روش‌ها برمی‌آید، replaceFirst اولین رخداد و replaceAll تمامی رخدادها را جایگزین می‌کند.

در ادامه متن مثالی به‌منظور توضیح عملکرد آمده است.

مثال

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class RegexMatches {

   private static String REGEX = “dog”;

   private static String INPUT = “The dog says meow. ” + “All dogs say meow.”;

   private static String REPLACE = “cat”;

   public static void main(String[] args) {

      Pattern p = Pattern.compile(REGEX);

      // get a matcher object

      Matcher m = p.matcher(INPUT);

      INPUT = m.replaceAll(REPLACE);

      System.out.println(INPUT);

   }

}

نتیجه به‌صورت زیر است

The cat says meow. All cats say meow.

روش‌های appendReplacement و appendTail

کلاس Matcher همچنین روش‌های appendReplacement و appendTail را برای جایگزینی متن فراهم می‌کند.

در ادامه متن مثالی به‌منظور توضیح عملکرد آمده است.

مثال

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class RegexMatches {

   private static String REGEX = “a*b”;

   private static String INPUT = “aabfooaabfooabfoob”;

   private static String REPLACE = “-“;

   public static void main(String[] args) {

      Pattern p = Pattern.compile(REGEX);

      // get a matcher object

      Matcher m = p.matcher(INPUT);

      StringBuffer sb = new StringBuffer();

      while(m.find()) {

         m.appendReplacement(sb, REPLACE);

      }

      m.appendTail(sb);

      System.out.println(sb.toString());

   }

}

نتیجه به‌صورت زیر است

خروجی

-foo-foo-foo-

روش‌های کلاس PatternSyntaxException

PatternSyntaxException یک استثناء بدون کنترل است که یک خطای دستور زبانی در یک الگوی عبارت منظم را نشان می‌دهد. کلاس PatternSyntaxException روش‌های زیر را فراهم می‌کند و به شما کمک می‌کند تا بدانید چه اتفاقی افتاده است.

 

ردیفروش و توضیحات
۱public String getDescription()

توضیحات خطا را بازیابی می‌کند.

۲public int getIndex()

خطای شاخص را بازیابی می‌کند.

۳public String getPattern()

الگوی اشتباه عبارت منظم را بازیابی می‌کند.

۴public String getMessage()

یک‌رشته چندخطی حاوی توضیحات خطای دستور زبانی و شاخص آن، الگوی عبارت منظم اشتباه و یک نشانه بصری از شاخص خطا در الگوی بازگشتی را برمی‌گرداند.

آنچه در آموزش بعدی خواهید خواند

در این بخش از آموزش جاوا شما با عبارات منظم در جاوا آشنا شدید در آموزش بعدی به بررسی متدها در جاوا می‌پردازیم.

 

tutorialspoint

Tags
درباره نویسنده

Leave a reply

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *