در توسینسو تدریس کنید

و

با دانش خود درآمد کسب کنید

آموزش جاوا (Java) قسمت 22 : عبارات منظم (Regular Expression)

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

آموزش جاوا (Java) قسمت 22 : عبارات منظم (Regular Expression)

آموزش جاوا (Java) قسمت 22 : عبارات منظم (Regular Expression)

آموزش جاوا (Java) قسمت 22 : عبارات منظم (Regular Expression)

متدهای مربوط به کلاس 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 باشید

نویسنده: مهدی عادلی فر

منبع: جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو

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

#برنامه_نویسی_جاوا #آموزش_برنامه_نویسی_جاوا #آموزش_regular_expression #کار_با_رشته_ها_در_جاوا #متدهای_مربوط_به_رشته_ها_در_جاوا #برنامه_نویسی_با_regular_expressions #آموزش_جاوا #عبارات_منظم_در_جاوا #دوره_آموزشی_جاوا #تطبیق_الگوها_در_جاوا
عنوان
1 آموزش جاوا (Java) قسمت 1 : معرفی ، خصوصیات و شروع به کار رایگان
2 آموزش جاوا (Java) قسمت 2 : شی گرایی قسمت یک رایگان
3 آموزش جاوا (Java) قسمت 3: شی گرایی قسمت دو رایگان
4 آموزش جاوا (Java) قسمت 4 : شی گرایی قسمت سه رایگان
5 آموزش جاوا (Java) قسمت 5 : انواع داده رایگان
6 آموزش جاوا (Java) قسمت 6 : انواع متغیر رایگان
7 آموزش جاوا (Java) قسمت 7 : Modifier ها رایگان
8 آموزش جاوا (Java) قسمت 8 : عملگرها قسمت یک رایگان
9 آموزش جاوا (Java) قسمت 9 : عملگرها قسمت دو رایگان
10 آموزش جاوا (Java) قسمت 10 : حلقه های تکرار رایگان
11 آموزش جاوا (Java) قسمت 11 : عبارات شرطی رایگان
12 آموزش جاوا (Java) قسمت 12 : کلاس Wrapper اعداد رایگان
13 آموزش جاوا (Java) قسمت 12 : کلاس Wrapper اعداد رایگان
14 آموزش جاوا (Java) قسمت 14: کلاس Wrapper کاراکترها رایگان
15 آموزش جاوا (Java) قسمت 15 : کلاس String و کار با رشته قسمت یک رایگان
16 آموزش جاوا (Java) قسمت 16 : کلاس String و کار با رشته قسمت دو رایگان
17 آموزش جاوا (Java) قسمت 17 : کلاس String و کار با رشته قسمت سه رایگان
18 آموزش جاوا (Java) قسمت 18 : کلاس String و کار با رشته قسمت چهار رایگان
19 آموزش جاوا (Java) قسمت 19 : StringBuilder و StringBuffer رایگان
20 آموزش جاوا (Java) قسمت 20 : استفاده از آرایه ها رایگان
21 آموزش جاوا (Java) قسمت 21 : آموزش کار با تاریخ رایگان
22 آموزش جاوا (Java) قسمت 22 : عبارات منظم (Regular Expression) رایگان
23 آموزش جاوا (Java) قسمت 23 : تعریف و استفاده از متدها قسمت یک رایگان
24 آموزش جاوا (Java) قسمت 24 : تعریف و استفاده از متدها قسمت دو رایگان
25 آموزش جاوا (Java) قسمت 25 : کار با استریم ها و فایل ها رایگان
26 آموزش جاوا (Java) قسمت 26 : کار با دایرکتوری ها رایگان
27 آموزش جاوا (Java) قسمت 27 : کلاس ByteArrayInputStream رایگان
28 آموزش جاوا (Java) قسمت 28 : معرفی کلاس File و متدها رایگان
29 آموزش جاوا (Java) قسمت 29 : معرفی و شرح Exception ها قسمت 1 رایگان
30 آموزش جاوا (Java) قسمت 30 : معرفی و شرح Exception ها قسمت 2 رایگان
31 آموزش جاوا (Java) قسمت 31 : معرفی و شرح Exception ها قسمت 3 رایگان
32 آموزش جاوا (Java) قسمت 32 : استفاده از انوع کلاس های داخلی رایگان
33 آموزش جاوا (Java) قسمت 33 : وراثت کلاس ها و انواع آن رایگان
34 آموزش جاوا (Java) قسمت 34 : Override کردن متد ها رایگان
35 آموزش جاوا (Java) قسمت 35 : چند ریختی (Polymorphism) رایگان
36 آموزش جاوا (Java) قسمت 36 : Enum و ویژگی های آن رایگان
37 آموزش جاوا (Java) قسمت 37 : معرفی Abstract رایگان
38 آموزش جاوا (Java) قسمت 38 : استفاده از کپسول بندی (Encapsulation) رایگان
39 آموزش جاوا (Java) قسمت 39 : استفاده از اینترفیس ها رایگان
40 آموزش جاوا (Java) قسمت 40 : پکیج(Package) و نحوه استفاده رایگان
41 آموزش جاوا (Java) قسمت 41 : معرفی داده ساختارها Enumeration رایگان
42 آموزش جاوا (Java) قسمت 42 : داده ساختار BitSet رایگان
43 آموزش جاوا (Java) قسمت 43 : داده ساختار Vector رایگان
44 آموزش جاوا (Java) قسمت 44 : داده ساختار Stack (پشته) رایگان
45 آموزش جاوا (Java) قسمت 45 : داده ساختار Dictionary رایگان
46 آموزش جاوا (Java) قسمت 46 : داده ساختار Hashtable رایگان
47 آموزش جاوا (Java) قسمت 47 : داده ساختار Properites رایگان
48 آموزش جاوا (Java) قسمت 48 : معرفی و آموزش جنریک (Generic) رایگان
49 آموزش جاوا (Java) قسمت 49 : برنامه نویسی سوکت و شبکه قسمت 1 رایگان
50 آموزش جاوا (Java) قسمت 50 : برنامه نویسی سوکت و شبکه قسمت 2 رایگان
51 آموزش جاوا (Java) قسمت 51 : استفاده از Lambda Expression رایگان
52 آموزش جاوا (Java) قسمت 52 : Thread و Multi-Threading رایگان
53 آموزش جاوا (Java) قسمت 53 : Runnable در Thread و Multi-Threading رایگان
54 آموزش جاوا (Java) قسمت 54 : کلاس Thread و متدها رایگان
زمان و قیمت کل 0″ 0
0 نظر

هیچ نظری ارسال نشده است! اولین نظر برای این مطلب را شما ارسال کنید...

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره تابستانه می تونی امروز ارزونتر از فردا خرید کنی ....