درخواست های ارتباط
جستجو
لیست دوستان من
صندوق پیام
همه را دیدم
  • در حال دریافت لیست پیام ها
صندوق پیام
رویدادها
همه را دیدم
  • در حال دریافت لیست رویدادها
همه رویدادهای من
دوره های مرتبط
دوره آموزشی ساخت ربات تلگرام
مدرس: taghandiki
این دوره را در 8 قسط خریداری کنید
ساخت و مدیریت ربات تلگرام از صفر با زبان سی شارپ
مدرس: مهدی عادلی
این دوره را در 2 قسط خریداری کنید
دوره آموزشی مقدماتی برنامه نویسی به زبان سی شارپ
مدرس: حسین احمدی
این دوره را در 17 قسط خریداری کنید
دوره آموزشی پردازش متن با زبان برنامه نویسی پایتون
مدرس: taghandiki
این دوره را در 20 قسط خریداری کنید
دوره آموزشی برنامه نویسی حرفه ای پایتون به زبان ساده
مدرس: حسین احمدی
این دوره را در 23 قسط خریداری کنید
دوره آموزشی برنامه نویسی اندروید با زبان جاوا به زبان ساده
مدرس: مهدی عادلی
این دوره را در 27 قسط خریداری کنید
دوره آموزشی طراحی رابط کاربری با JavaFX
مدرس: hharddy
این دوره را در 13 قسط خریداری کنید
دوره آموزشی برنامه نویسی به زبان پرل بصورت پروژه محور
مدرس: dr-iman
این دوره را در 13 قسط خریداری کنید
دوره آموزشی مقدماتی برنامه نویسی جاوا به زبان ساده
مدرس: مهدی عادلی
این دوره را در 17 قسط خریداری کنید
دوره آموزشی Exploit نویسی به زبان Perl
مدرس: dr-iman
این دوره را در 7 قسط خریداری کنید

آموزش برنامه نویسی جاوا قسمت بیست و دوم: معرفی و آموزش عبارات منظم(Regular expression)

0 نظرات
209 بازدیدها
با سلام به همه دوستان و همراهان itpro. تشخیص الگو در متن اهمیت بسیاری دارد. در بسیاری از موارد شما انتظار دارید که متنی که کاربر وارد کرده است در قالب مشخصی باشد. برای مثال وارد کردن ایمیل یا شماره تلفنن باید همیشه با یک فرمت و قالب مشخصی باشد. اگر هربار بخواهیم با استفاده از برنامه نویسی چک کنیم که متن وارد شده درست وارد شده است یا خیر کار سختی است که ممکن است کارایی برنامه را پایین بیاورد. برای حل این مشکل از عبارات منظم یا regular expression ها استفاده می کنیم. جاوا کتابخانه های regular expression را در پکیج java.util.regex قرار داده است. نحوه استفاده از این کتابخانه مانند برنامه نویسی به زبان پرل است و به راحتی قابل یادگیری است. Regular expression یک ترتیب مخصوص از کاراکتر ها است که کمک می کند که رشته ها را با الگوی مورد نظر تطبیق دهید. از این تکنیک می توان در جستجو و ویرایش رشته ها استفاده کرد. پکیج java.util.regex سه کلاس اصلی دارد که عبارتند از:

کلاس Pttern


این کلاس constructor خارجی ندارد. نحوه کار این کلاس این است که ابتدا شما باید یک regular expression به آن داده و کامپایل کنید. سپس می توانید از آن و متدهای آن استفاده کنید. برای کامپایل regular expression در این کلاس شما باید از متد compile استفاده کنید.

کلاس Matcher


یک شئ Matcher یک موتور است که الگو ها را با رشته های ورودی تطبیق می دهد. این کلاس هم مانند کلاس Pattern هیچ constructor عمومی ندارد. شما برای این که شئ matcher خود را مقداردهی کنید باید متد matcher را از کلاس Pattern فراخوانی نمایید.

کلاس PatternSyntaxException


اشیاء این کلاس مشکلات سینتکسی و نوشتاری را داخل الگوی regular expression مشخص می کند.

پردازش گروه ها


اگر یک دنباله از کارکتر ها را در داخل پرانتز قرار دهیم به عنوان یک گروه شناخته می شود که با گروه ها به عنوان یک واحد رفتار خواهد شد. برای مثال گروه (dog) یک گروه است که از سه کاراکتر d, o, g ساخته شده است. پیدا کردن گروه ها با شمارش پرانتز های باز از سمت چپ به راست انجام می شود. شمارش گروه ها با تعداد پرانتز های باز شده از چپ به راست محاسبه می شود. برای مثال در عبارت زیر 4 گروه را می توان مشخص کرد.
((A)(B(C)))
گروه های به دست آمده از عبارت بالا به شرح زیر است:
((A)(B(C)))
(A)
(B(C))
(C)
برای این که بدانیم یک عبارت چند گروه دارد متد groupCount را از شئ matcher فراخوانی می کنیم. این متد یک عدد صحیح برمی گرداند که تعداد گروه های به موجود در عبارت می باشد. یک گروه گروهی است که کل عبارت را در نظر می گیرد که به آن گروه 0 گفته می شود. این گروه در شمارش گروه ها در متد groupCount نمی آید. در مثال زیر کدی آورده شده است که نحوه استفاده از کلاس های گفته شده را نشان می دهد.
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
    public static void main( String args[] ){

      // رشته ای که می خواهیم مورد ارزیابی قرار دهیم
      String line = "This order was placed for QT3000! OK?";
	  //الگویی که تعریف می کنیم
      String pattern = "(.*)(\\d+)(.*)";

      // ساخت شئ پترن
      Pattern r = Pattern.compile(pattern);

      // ساخت شی متچر
      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
در قسمت pattern کد بالا از کاراکتر هایی استفاده شده است که باعث می شود الگوی متن مشخص شود. هرکدام از این کاراکتر ها معنی و مفهوم خاصی دارند که در شکل زیر هرکدام را نشان می دهیم. اگر با نظریه زبان ها و ماشین ها اشنا باشید می بینید که این نوشتار ها بسیار شبیه به عبارات منظم در آن مبحث می باشد.
Image

Image

Image


متدهای مربوط به کلاس Matcher


در ادامه به معرفی متدهای موجود در کلاس Matcher می پردازیم.

متدهای اندیسی


متد start این متد اندیس شروع تطبیق الگوی گرفته شده در متن را برمی گرداند. این متد همچنین یک ورودی می گیرد که آن ورودی شماره گروه را مشخص می نماید.
متد end این متد آخرین اندیس رشته را که با الگو تطابق دارد به اضافه یک را برمی گرداند. همچنین این متد می تواند یک آرگومان نیز داشته باشد که شماره گروه را می گیرد و اندیس پایانی آن گروه را برمی گرداند برای مثال از متدهای start , end به مثال زیر توجه نمایید در این مثال به شمارش کلمه cat می پردازیم:
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
در مثال بالا مشاهده می کنید که تعداد کلمات را شناخته و محل شروع و پایان آن ها را نشان می دهد. همانطور که درکد قابل مشاهده است با کلمه cat به شکل سه عدد کاراکتر c , a , t که از هم جدا باشند رفتار نمی شود و به شکل یک واحد یکتا با آن رفتار می شود.

متدهای جستجو

متد lookingAt این متد مشخص می کند که الگوی مورد نظر در ابتدای متن وجود دارد یا نه که اگر الگوی مورد نظر وجود داشت مقدار true برمی گرداند.
متد find این متد نیز کاری مانند متد lookingAt را انجام می دهد با این تفاوت که در صورتی که اگر در متن الگویی تطبیق داشته باشد مقدار start و end به نسبت همان تغییر خواهد کرد و در بار بعدی که این متد فراخوانی می شود الگوی تطبیق شده بعدی در متد start, end قرار خواهد گرفت.
متد matches این متد سعی می کند که کل متن را با کل الگو تطبیق دهد و اگر این کار انجام شد مقدار true برمی گرداند. در ادامه مثالی از متدهای lookingAt و matches آورده شده است که تفاوت این دو را نشان می دهد.
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

متدهای جایگزینی


متد appendReplacement این متد با یک رشته را گرفته و جایگزین محل تطبیق regular expression می کند و مقدار جایگزین شده را به یک شئ StringBuffer اضافه می کند.
متد appendTail این متد عمل جایگزینی را انجام نمی دهد بلکه عمل append را از شئ StringBuffer برای متن match شده انجام می دهد. البته از جایی که عمل متد end برمی گرداند به شئ StringBuffer اضافه می کند.
متد replaceAll این متد یک رشته به عنوان ورودی می گیرد و هرجایی که الگو تطبیق داشته شده باشد در آن قسمت عمل جایگزینی رشته را انجام می دهد.
متد replaceFirst این متد یک رشته را به عنوان ورودی می گیرد و فقط در اولین تطبیق الگو عمل جایگزینی را انجام می دهد.
در کد زیر مثالی از به کاربردن متدهای 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();
      m.find();
m.appendReplacement(sb,REPLACE);
m.find();
m.appendReplacement(sb,REPLACE);

      m.appendTail(sb);
      System.out.println(sb.toString());
   }
}

خروجی کد بالا به شکل زیر خواهد بود:
-foo-fooabfoob
در ادامه مثالی آورده شده است که کاربرد متدهای 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.

متدهای کلاس PatternSyntaxException


ممکن است هنگامی که از regular expression استفاده می کنیم خطاهای دستوری در الگوهای ما باشد که ما برای آن خطاها فکری نکرده باشیم. تشخیص این خطاها ممکن است کمی سخت باشد. کلاس PatternSyntaxException به ما کمک می کند تا بفهمیم در کدام قسمت از الگو خطا رخ داده است و چه خطایی در آن قسمت رخ داده است. متدهای این کلاس که به ما کمک می کنند عبارتند از:
  1. متد getDescription: این متد شرح خطا را برمی گرداند.
  2. متد getIndex این متد اندیس خطا را نشان می دهد.
  3. متد getPattern این متد الگویی را که خطا دارد را برمی گرداند.
  4. متد getMessage این متد یک متن چند خطی را که شامل شرح خطا و اندیس خطا و الگوی خطا دار و یک سری توضیحات دیگر را برمی گرداند.
Itpro باشید


نویسنده: مهدی عادلی فر
منبع: انجمن تخصصی فناوری اطلاعات ایران
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.
برچسب ها
ردیف عنوان قیمت
1 آموزش برنامه نویسی جاوا قسمت اول : معرفی ویژگیها ، خصوصیات و نحوه شروع به کار با زبان برنامه نویسی جاوا رایگان
2 آموزش برنامه نویسی جاوا قسمت دوم : بررسی مفاهیم شیء ، کلاس ، Method و شروع برنامه نویسی با زبان جاوا رایگان
3 آموزش برنامه نویسی جاوا قسمت سوم: معرفی مفاهیم اولیه و مفاهیم شی گرایی در برنامه نویسی جاوا رایگان
4 آموزش برنامه نویسی جاوا قسمت چهارم: معرفی مفاهیم شی گرایی در برنامه نویسی جاوا - ادامه رایگان
5 آموزش برنامه نویسی جاوا قسمت پنجم: معرفی انواع داده ها در جاوا رایگان
6 آموزش برنامه نویسی جاوا قسمت ششم: آموزش انواع متغیر در جاوا رایگان
7 آموزش برنامه نویسی جاوا قسمت هفتم: معرفی Modifierها در جاوا رایگان
8 آموزش برنامه نویسی جاوا قسمت هشتم: معرفی و آموزش عملگرهای جاوا رایگان
9 آموزش برنامه نویسی جاوا قسمت نهم: معرفی و آموزش کار با عملگرها در جاوا - ادامه رایگان
10 آموزش برنامه نویسی جاوا قسمت دهم: کار با حلقه های تکرار در جاوا رایگان
11 آموزش برنامه نویسی جاوا قسمت یازدهم: معرفی و آموزش استفاده از عبارات شرطی در جاوا رایگان
12 آموزش برنامه نویسی جاوا قسمت دوازدهم: معرفی انواع کلاس wrapper مربوط به اعداد در جاوا و نحوه استفاده از آنها رایگان
13 آموزش برنامه نویسی جاوا قسمت سیزدهم: معرفی انواع کلاس wrapper مربوط به اعداد در جاوا و نحوه استفاده از آنها -ادمه رایگان
14 آموزش برنامه نویسی جاوا قسمت چهاردهم: معرفی و نحوه استفاده از کلاس Wrapper مربوط به کاراکتر ها در جاوا رایگان
15 آموزش برنامه نویسی جاوا قسمت پانزدهم: معرفی و آموزش نحوه استفاده از کلاس String و کار با رشته ها در جاوا رایگان
16 آموزش برنامه نویسی جاوا قسمت شانزدهم: معرفی و آموزش نحوه استفاده از کلاس String در جاوا و کار با رشته ها در جاوا ادامه رایگان
17 آموزش برنامه نویسی جاوا قسمت هفدهم: معرفی و آموزش نحوه استفاده از کلاس String در جاوا و کار با رشته ها در جاوا-ادامه 2 رایگان
18 آموزش برنامه نویسی جاوا قسمت هجدهم: معرفی و آموزش نحوه استفاده از کلاس String در جاوا و کار با رشته ها در جاوا-ادامه 3 رایگان
19 آموزش برنامه نویسی جاوا قسمت نوزدهم: معرفی و آموزش نحوه استفاده از کلاس های StringBuilder و StringBuffer رایگان
20 آموزش برنامه نویسی جاوا قسمت بیستم: معرفی و آموزش نحوه استفاده از آرایه ها رایگان
21 آموزش برنامه نویسی جاوا قسمت بیست و یکم: آموزش کار با تاریخ رایگان
22 آموزش برنامه نویسی جاوا قسمت بیست و دوم: معرفی و آموزش عبارات منظم(Regular expression) رایگان
23 آموزش برنامه نویسی جاوا قسمت بیست و سوم: نحوه تعریف و استفاده از متدها رایگان
24 آموزش برنامه نویسی جاوا قسمت بیست و چهارم: نحوه تعریف و استفاده از متدها- ادامه رایگان
25 آموزش برنامه نویسی جاوا قسمت بیست و پنجم: نحوه کار با استریم ها و فایل ها رایگان
26 آموزش برنامه نویسی جاوا قسمت بیست و ششم: نحوه کار با دایرکتوری ها رایگان
27 آموزش برنامه نویسی جاوا قسمت بیست و هفتم: معرفی و آموزش کلاس ByteArrayInputStream و کار با استریم ها رایگان
28 آموزش برنامه نویسی جاوا قسمت بیست و هشتم: معرفی کلاس File و شرح متدهای آن رایگان
29 آموزش برنامه نویسی جاوا قسمت بیست و نهم: معرفی و شرح Exception ها رایگان
30 آموزش برنامه نویسی جاوا قسمت سی ام: معرفی و شرح Exception ها- ادامه رایگان
31 آموزش برنامه نویسی جاوا قسمت سی و یکم: معرفی و شرح Exception ها- ادامه 2 رایگان
32 آموزش برنامه نویسی جاوا قسمت سی و دوم: معرفی و شرح استفاده از انوع کلاس های داخلی رایگان
33 آموزش برنامه نویسی جاوا قسمت سی و سوم: شرح وراثت کلاس ها و انواع آن رایگان
34 آموزش برنامه نویسی جاوا قسمت سی و چهارم: معرفی و شرح override کردن متد ها رایگان
35 آموزش برنامه نویسی جاوا قسمت سی و پنجم: معرفی و شرح چند ریختی (polymorphism) رایگان
36 آموزش برنامه نویسی جاوا قسمت سی و ششم: شرح enum و ویژگی های آن رایگان
37 آموزش برنامه نویسی جاوا قسمت سی و هفتم: معرفی و شرح abstract رایگان
38 آموزش برنامه نویسی جاوا قسمت سی و هشتم: معرفی و آموزش نحوه استفاده از کپسول بندی (encapsulation) رایگان
39 آموزش برنامه نویسی جاوا قسمت سی و نهم: معرفی و آموزش نحوه استفاده از اینترفیس ها رایگان
40 آموزش برنامه نویسی جاوا قسمت چهلم: معرفی مفهوم پکیج(package) و نحوه استفاده از آن رایگان
41 آموزش برنامه نویسی جاوا قسمت چهل و یکم: معرفی داده ساختارها - Enumeration رایگان
42 آموزش برنامه نویسی جاوا قسمت چهل و دوم: داده ساختار BitSet رایگان
43 آموزش برنامه نویسی جاوا قسمت چهل و سوم: داده ساختار Vector رایگان
44 آموزش برنامه نویسی جاوا قسمت چهل و چهارم: داده ساختار Stack(پشته) رایگان
45 آموزش برنامه نویسی جاوا قسمت چهل و پنجم: داده ساختار dictionary رایگان
46 آموزش برنامه نویسی جاوا قسمت چهل و ششم: داده ساختار Hashtable رایگان
47 آموزش برنامه نویسی جاوا قسمت چهل و هفتم: داده ساختار properites رایگان
48 آموزش برنامه نویسی جاوا قسمت چهل و هشتم: معرفی و آموزش مفهوم جنریک رایگان
49 آموزش برنامه نویسی جاوا قسمت چهل و نهم: معرفی و آموزش برنامه نویسی سوکت و شبکه سمت سرور رایگان
50 آموزش برنامه نویسی جاوا قسمت پنجاهم: معرفی و آموزش برنامه نویسی سوکت و شبکه- سمت کلاینت و ارتباط با یکدیگر رایگان
51 آموزش برنامه نویسی جاوا قسمت پنجاه و یکم: معرفی و آموزش استفاده از lambda expression رایگان
52 آموزش برنامه نویسی جاوا قسمت پنجاه و دوم:‌ معرفی مفاهیم Thread ها و Multi-Threading رایگان
53 آموزش برنامه نویسی جاوا قسمت پنجاه و سوم: معرفی و آموزشRunnable در Thread ها و Multi-Threading رایگان
54 آموزش برنامه نویسی جاوا قسمت پنجاه و چهارم: کلاس Thread و کار کردن با متدهای این کلاس رایگان
مطالب مرتبط

در حال دریافت اطلاعات

نظرات
هیچ نظری ارسال نشده است

    برای ارسال نظر ابتدا به سایت وارد شوید

    arrow