درخواست های ارتباط
جستجو
    لیست دوستان من
    صندوق پیام
    همه را دیدم
    • در حال دریافت لیست پیام ها
    صندوق پیام
    رویدادها
    همه را دیدم
    • در حال دریافت لیست رویدادها
    همه رویدادهای من

    تا 75 درصد تخفیف ویژه شب یلدا بر روی کلیه محصولات وب سایت توسینسو فقط تا 30 آذر

    مانده تا پایان تخفیف ها

    تخفیف های وب سایت
    همه تخفیف ها

    عضویت در

    کانال تلگرام

    توسینسو

    اطلاعات مطلب
      مدرس/نویسنده
      مهدی عادلی فر
      امتیاز: 144149
      رتبه:6
      117
      196
      285
      1466
      مهدی عادلی، بنیان گذار TOSINSO. کارشناس ارشد نرم افزار کامپیوتر از دانشگاه صنعتی امیرکبیر و #C و جاوا و اندروید کار می کنم. در زمینه های موبایل و وب و ویندوز فعالیت دارم و به طراحی نرم افزار و اصول مهندسی نرم افزار علاقه مندم. پروفایل کاربر
      دوره های مرتبط
      دوره های توسینسو دوره آموزشی اسکریپت نویسی Batch یا Batch Scripting در ویندوز به زبان ساده
      دوره آموزشی اسکریپت نویسی Batch یا Batch Scripting در ویندوز به زبان ساده
      مدرس: حسین احمدی
      این دوره را در 11 قسط خریداری کنید
      دوره آموزشی ساخت ربات تلگرام
      دوره آموزشی ساخت ربات تلگرام
      مدرس: کاظم تقندیکی
      این دوره را در 8 قسط خریداری کنید
      دوره آموزشی برنامه نویسی WPF در ویژوال استودیو
      دوره آموزشی برنامه نویسی WPF در ویژوال استودیو
      مدرس: امیر حسین فضلیخانی
      این دوره را در 12 قسط خریداری کنید
      دوره آموزشی برنامه نویسی پیشرفته زبان سی شارپ
      دوره آموزشی برنامه نویسی پیشرفته زبان سی شارپ
      مدرس: حسین احمدی
      این دوره را در 78 قسط خریداری کنید
      دوره آموزشی Exploit نویسی به زبان Perl
      دوره آموزشی Exploit نویسی به زبان Perl
      مدرس: ایمان جوادی
      این دوره را در 7 قسط خریداری کنید
      دوره آموزشی مقدماتی برنامه نویسی جاوا به زبان ساده
      دوره آموزشی مقدماتی برنامه نویسی جاوا به زبان ساده
      مدرس: مهدی عادلی فر
      این دوره را در 17 قسط خریداری کنید
      دوره تخصصی آموزش متن کاوی با ابزار NLTK
      دوره تخصصی آموزش متن کاوی با ابزار NLTK
      مدرس: کاظم تقندیکی
      این دوره را در 11 قسط خریداری کنید
      دوره متوسطه برنامه نویسی به زبان جاوا به زبان ساده
      دوره متوسطه برنامه نویسی به زبان جاوا به زبان ساده
      مدرس: مهدی عادلی فر
      این دوره را در 18 قسط خریداری کنید
      دوره آموزشی مقدماتی برنامه نویسی به زبان سی شارپ
      دوره آموزشی مقدماتی برنامه نویسی به زبان سی شارپ
      مدرس: حسین احمدی
      این دوره را در 17 قسط خریداری کنید
      ساخت و مدیریت ربات تلگرام از صفر با زبان سی شارپ
      ساخت و مدیریت ربات تلگرام از صفر با زبان سی شارپ
      مدرس: مهدی عادلی فر
      این دوره را در 2 قسط خریداری کنید
      دوره آموزشی برنامه نویسی اندروید با زبان جاوا به زبان ساده
      دوره آموزشی برنامه نویسی اندروید با زبان جاوا به زبان ساده
      مدرس: مهدی عادلی فر
      این دوره را در 27 قسط خریداری کنید
      دوره آموزشی برنامه نویسی به زبان پرل بصورت پروژه محور
      دوره آموزشی برنامه نویسی به زبان پرل بصورت پروژه محور
      مدرس: ایمان جوادی
      این دوره را در 13 قسط خریداری کنید
      دوره آموزشی برنامه نویسی مقدماتی پایتون به زبان ساده
      دوره آموزشی برنامه نویسی مقدماتی پایتون به زبان ساده
      مدرس: حسین احمدی
      این دوره را در 23 قسط خریداری کنید
      دوره آموزشی پردازش متن با زبان برنامه نویسی پایتون
      دوره آموزشی پردازش متن با زبان برنامه نویسی پایتون
      مدرس: کاظم تقندیکی
      این دوره را در 20 قسط خریداری کنید
      دوره آموزشی طراحی رابط کاربری با JavaFX
      دوره آموزشی طراحی رابط کاربری با JavaFX
      مدرس: حسام رسولیان
      این دوره را در 13 قسط خریداری کنید

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

      تاریخ 33 ماه قبل
      نظرات 0
      بازدیدها 1623
      با سلام به همه دوستان و همراهان 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 کد بالا از کاراکتر هایی استفاده شده است که باعث می شود الگوی متن مشخص شود. هرکدام از این کاراکتر ها معنی و مفهوم خاصی دارند که در شکل زیر هرکدام را نشان می دهیم. اگر با نظریه زبان ها و ماشین ها اشنا باشید می بینید که این نوشتار ها بسیار شبیه به عبارات منظم در آن مبحث می باشد.
      آموزش برنامه نویسی جاوا قسمت بیست و دوم: معرفی و آموزش عبارات منظم(Regular expression)

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

      آموزش برنامه نویسی جاوا قسمت بیست و دوم: معرفی و آموزش عبارات منظم(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 باشید


      نویسنده: مهدی عادلی فر
      منبع: انجمن تخصصی فناوری اطلاعات ایران
      هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.
      برچسب ها
      ردیفعنوان
      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 و کار کردن با متدهای این کلاس
      دورهمجموعه کل دوره
      مطالب مرتبط

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

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

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