الاثنين، 30 ديسمبر 2019

التعابير العادية في جافا Java Regular Expressions

التعابير العادية في جافا

 Java Regular Expressions

التعابير العادية في جافا Java Regular Expressions

توفر Java حزمة java.util.regex لمطابقة الأنماط مع التعبيرات العادية.  تعبيرات Java العادية تشبه إلى حد كبير لغة برمجة بيرل وسهلة التعلم.

 التعبير العادي عبارة عن تسلسل خاص من الأحرف يساعدك على مطابقة أو إيجاد سلاسل أو مجموعات أخرى من السلاسل ، باستخدام بناء جملة متخصص محتفظ به في نمط.  يمكن استخدامها للبحث عن النصوص والبيانات أو تحريرها أو معالجتها.

 تتكون حزمة java.util.regex أساسًا من الفئات الثلاثة التالية -
  • Pattern Class −.كائن النقش هو تمثيل مترجم للتعبير العادي.  لا توفر الفئة Pattern منشئات عامة.  لإنشاء نقش ، يجب عليك أولاً استدعاء أحد أساليب التحويل البرمجي الثابتة العامة () ، والتي ستُرجع بعد ذلك كائن نقش.  تقبل هذه الطرق التعبير العادي كوسيطة أولى
  • Matcher Class − .
  • كائن Matcher هو المحرك الذي يفسر النموذج ويقوم بتنفيذ عمليات المطابقة مقابل سلسلة إدخال.  مثل الفئة Pattern ، لا تحدد Matches المُنشئات العامة.  يمكنك الحصول على كائن مطابقة عن طريق استدعاء الأسلوب matcher () على كائن نقش
  • PatternSyntaxException

     كائن PatternSyntaxException هو استثناء لم يتم التحقق منه يشير إلى خطأ في بناء الجملة في نقش تعبير عادي.

  • Capturing Groups
مجموعات الالتقاط هي طريقة للتعامل مع أحرف متعددة كوحدة واحدة.  يتم إنشاؤها عن طريق وضع الأحرف التي سيتم تجميعها داخل مجموعة من الأقواس.  على سبيل المثال ، يُنشئ التعبير العادي (dog) مجموعة واحدة تحتوي على الأحرف "d" و "o" و "g".

 يتم ترقيم مجموعات الالتقاط عن طريق حساب أقواس الفتح من اليسار إلى اليمين.  في التعبير ((A) (B (C))) ، على سبيل المثال ، هناك أربع مجموعات من هذا القبيل -
  • ((A)(B(C)))
  • (A)
  • (B(C))
  • (C)
لمعرفة عدد المجموعات الموجودة في التعبير ، اتصل بأسلوب groupCount على كائن مطابق.  تُرجع طريقة groupCount عددًا من مجموعات الالتقاط الموجودة في نمط المطابق.

 هناك أيضًا مجموعة خاصة ، المجموعة 0 ، والتي تمثل دائمًا التعبير بأكمله.  هذه المجموعة ليست مدرجة في المجموع الذي أبلغ عنه groupCount.

 مثال

 يوضح المثال التالي كيفية العثور على سلسلة أرقام من السلسلة الأبجدية الرقمية المحددة -

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
صيغة التعابير المنتظمة  Regular Expression Syntax
في ما يلي جدول يسرد جميع صيغ التعبير الشرعي العادي المتاحة في Java -
التعبيرالمطابقة
^يطابق بداية السطر.
$يطابق نهاية السطر.
..يطابق أي حرف واحد باستثناء السطر الجديد.  باستخدام خيار m يسمح لها بمطابقة السطر الجديد أيضًا
[...]يطابق أي حرف واحد بين قوسين.
[^...]يطابق أي حرف واحد وليس بين قوسين.
\Aبداية السلسلة بأكملها.
\zنهاية السلسلة بأكملها.
\Zنهاية السلسلة بأكملها باستثناء فاصل السطر النهائي المسموح به.
re*يطابق 0 أو أكثر من تكرارات التعبير السابق.
re+يطابق 1 أو أكثر من الشيء السابق.
re?يطابق 0 أو 1 حدوث التعبير السابق.
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.يطابق الأرقام.  أي ما يعادل [0-9]
\Dيطابق nondigits.
\Aيطابق بداية السلسلة.
\Zيطابق نهاية السلسلة.  إذا كان هناك سطر جديد ، فسيتم مطابقته مباشرة قبل السطر الجديد.
\zيطابق نهاية السلسلة.
\Gيطابق النقطة التي انتهت فيها المباراة الأخيرة.
\nالمرجع الخلفي لالتقاط رقم المجموعة "n".
\bيطابق حدود الكلمة عند خارج الأقواس.  يطابق مسافة للخلف (0x08) عندما يكون داخل الأقواس.
\Bيطابق الحدود غير الكلمة.
\n, \t, etc.يطابق الأسطر الجديدة ، عوائد النقل ، علامات التبويب ، إلخ.
\Qالهروب (الاقتباس) جميع الحروف تصل إلى \ E.
\Eبدأت نهايات الاقتباس مع \ Q.

فئة  المطابقة والدوال Methods of the Matcher Class

فيما يلي قائمة بالدوال المثيل المفيدة -

دوال الفهرسة Index Methods

توفر دوال الفهرس قيم فهرس مفيدة تظهر بالضبط أين تم العثور على التطابق في سلسلة الإدخال -
الرقمالدالة والوصف
1
public int start()

2
public int start(int group)
إرجاع مؤشر البداية للتسلسل الذي تم التقاطه بواسطة المجموعة المحددة أثناء عملية المطابقة السابقة.
3
public int end()
إرجاع الإزاحة بعد مطابقة الحرف الأخير.
4
public int end(int group)
إرجاع الإزاحة بعد الحرف الأخير للتسلسل الذي استولت عليه المجموعة المعينة أثناء عملية المطابقة السابقة.

دوال الدراسة Study Methods

تقوم دوال الدراسة بمراجعة سلسلة الإدخال وإرجاع منطقية توضح ما إذا كان النمط موجودًا أم لا -
الرقم.الدوال وااوصف
1
public boolean lookingAt()
.محاولات لمطابقة تسلسل الإدخال ، بدءًا من بداية المنطقة ، مقابل النموذج
2
public boolean find()
محاولات للعثور على التسلسل التالي لتسلسل الإدخال الذي يطابق النموذج.
3
public boolean find(int start)
إعادة تعيين هذا المطابق ثم يحاول العثور على التسلسل التالي من تسلسل الإدخال الذي يطابق النموذج ، بدءًا من الفهرس المحدد.
4
public boolean matches()
محاولات لمطابقة المنطقة بأكملها ضد النمط.

دوال الاستبدال Replacement Methods

دوال الاستبدال هي دوال مفيدة لاستبدال النص في سلسلة الإدخال -
.رقم.الدالة والوصف 
1
public Matcher appendReplacement(StringBuffer sb, String replacement)
تنفذ خطوة إلحاق غير بديلة.
2
public StringBuffer appendTail(StringBuffer sb)
تنفيذ خطوة إلحاق المحطة الطرفية واستبدالها.
3
public String replaceAll(String replacement)
يستبدل كل تسلسل لاحق من تسلسل الإدخال الذي يطابق النموذج بسلسلة الاستبدال المحددة.
4
public String replaceFirst(String replacement)
يستبدل التسلسل الأول من تسلسل الإدخال الذي يطابق النموذج بسلسلة الاستبدال المحددة.
5
public static String quoteReplacement(String s)
إرجاع سلسلة استبدال حرفية للخيط المحدد.  تنتج هذه الطريقة سلسلة ستعمل كبديل حرفي في طريقة appendReplacement للفئة Matcher.

دوال البداية والنهاية

 فيما يلي المثال الذي يحسب عدد مرات ظهور كلمة "قطة" في سلسلة الإدخال -

مثال Exampl
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" ليست مجرد سلسلة فرعية في كلمة أطول.  كما يوفر بعض المعلومات المفيدة حول مكان حدوث سلسلة المطابقة.

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

The matches and lookingAt Methods

تحاول كل من التطابقات و lookAt أن تطابق تسلسل إدخال مقابل نمط.  الفرق ، مع ذلك ، هو أن التطابقات تتطلب مطابقة تسلسل الإدخال بالكامل ، بينما لا يبحث lookAt.

 تبدأ كلتا الطريقتين دائمًا في بداية سلسلة الإدخال.  فيما يلي مثال يوضح الوظيفة -
مثال Example

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

The replaceFirst and replaceAll Methods

تستبدل الأساليب replaceFirst و replaceAll النص الذي يتطابق مع تعبير عادي محدد.  كما تشير أسمائهم ، يستبدل replaceFirst التكرار الأول ، ويستبدل AllA كل التكرارات.

 فيما يلي مثال يوضح الوظيفة -
مثال Example

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 لاستبدال النص.


 فيما يلي مثال يوضح الوظيفة -

مثال Example

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 Class Methods

إن PatternSyntaxException هو استثناء لم يتم التحقق منه يشير إلى خطأ في بناء الجملة في نقش تعبير عادي.  توفر الفئة PatternSyntaxException الأساليب التالية لمساعدتك في تحديد الأخطاء التي حدثت -
الرقمالطريقة والوصف
1
public String getDescription()
يسترجع وصف الخطأ.
2
public int getIndex()
يسترجع مؤشر الخطأ.
3
public String getPattern()
يسترجع نمط التعبير المنتظم الخاطئ.
4
public String getMessage()
إرجاع سلسلة متعددة الأسطر تحتوي على وصف خطأ بناء الجملة وفهرسه ونمط تعبير عادي خاطئ ومؤشر مرئي لفهرس الخطأ داخل النموذج.




التسميات: