طرق العمل مع المجموعات المأسورة
يتضمن الكود المصدري للتطبيقRegexDemo
استدعاء الأسلوب m.group()
. هذه الطريقة group()
هي واحدة من عدة طرق للفصل Matcher
تهدف إلى العمل مع المجموعات التي تم التقاطها:
-
تقوم الطريقة
int groupCount()
بإرجاع عدد المجموعات التي تم التقاطها في نمط المحلل. ولا يأخذ هذا الرقم في الاعتبار رقم مجموعة الالتقاط الخاصة 0، والذي يتوافق مع النمط ككل. -
تقوم الطريقة
String group()
بإرجاع أحرف المطابقة السابقة التي تم العثور عليها. للإبلاغ عن بحث ناجح عن سلسلة فارغة، تقوم هذه الطريقة بإرجاع سلسلة فارغة. إذا لم يقم المحلل بعد بإجراء بحث أو فشلت عملية بحث سابقة، فسيتم طرح استثناءIllegalStateException
. -
String group(int group)
تشبه الطريقة الطريقة السابقة، إلا أنها تقوم بإرجاع أحرف المطابقة السابقة التي تم العثور عليها، والتي تم التقاطها بواسطة رقم المجموعة المحدد بواسطة المعلمةgroup
. لاحظ أن هذاgroup(0)
يعادلgroup()
. إذا لم يكن القالب يحتوي على مجموعة تم التقاطها بالرقم المحدد، فستطرح الطريقة استثناءًIndexOutOfBoundsException
. إذا لم يقم المحلل بعد بإجراء بحث أو فشلت عملية بحث سابقة، فسيتم طرح استثناءIllegalStateException
. -
تقوم الطريقة
String group(String name)
بإرجاع أحرف المطابقة السابقة التي تم العثور عليها، والتي تم التقاطها بواسطة مجموعة الأسماء. إذا لم يكن اسم المجموعة الملتقطة موجودًا في القالب، فسيتم طرح استثناءIllegalArgumentException
. إذا لم يقم المحلل بعد بإجراء بحث أو فشلت عملية بحث سابقة، فسيتم طرح استثناءIllegalStateException
.
groupCount()
والأساليب group(int group)
:
Pattern p = Pattern.compile("(.(.(.)))");
Matcher m = p.matcher("abc");
m.find();
System.out.println(m.groupCount());
for (int i = 0; i <= m.groupCount(); i++)
System.out.println(i + ": " + m.group(i));
نتائج التنفيذ:
3
0: abc
1: abc
2: bc
3: c
طرق تحديد مراكز المباراة
يوفر الفصلMatcher
عدة طرق تُرجع مواضع البداية والنهاية للمطابقة:
-
تقوم الطريقة
int start()
بإرجاع موضع البداية للمطابقة السابقة التي تم العثور عليها. إذا لم يقم المحلل بعد بإجراء بحث أو فشلت عملية بحث سابقة، فسيتم طرح استثناءIllegalStateException
. -
تشبه الطريقة
int start(int group)
الطريقة السابقة، ولكنها تُرجع موضع البداية للمطابقة السابقة التي تم العثور عليها للمجموعة التي تم تحديد رقمها بواسطة المعلمةgroup
. إذا لم يكن القالب يحتوي على مجموعة تم التقاطها بالرقم المحدد، فستطرح الطريقة استثناءًIndexOutOfBoundsException
. إذا لم يقم المحلل بعد بإجراء بحث أو فشلت عملية بحث سابقة، فسيتم طرح استثناءIllegalStateException
. -
تشبه الطريقة
int start(String name)
الطريقة السابقة، ولكنها تُرجع موضع البداية للمطابقة السابقة التي تم العثور عليها للمجموعة المسماةname
. إذا لم تكن المجموعة الملتقطةname
موجودة في القالب، فسيتم طرح استثناءIllegalArgumentException
. إذا لم يقم المحلل بعد بإجراء بحث أو فشلت عملية بحث سابقة، فسيتم طرح استثناءIllegalStateException
. -
تقوم الطريقة
int end()
بإرجاع موضع الحرف الأخير من المطابقة السابقة التي تم العثور عليها بالإضافة إلى 1. إذا لم تقم أداة المطابقة بإجراء مطابقة بعد أو فشلت عملية البحث السابقة، فسيتم طرح استثناءIllegalStateException
. -
تشبه الطريقة
int end(int group)
الطريقة السابقة، ولكنها تُرجع موضع النهاية للمطابقة السابقة التي تم العثور عليها للمجموعة التي تم تحديد رقمها بواسطة المعلمةgroup
. إذا لم يكن القالب يحتوي على مجموعة تم التقاطها بالرقم المحدد، فستطرح الطريقة استثناءًIndexOutOfBoundsException
. إذا لم يقم المحلل بعد بإجراء بحث أو فشلت عملية بحث سابقة، فسيتم طرح استثناءIllegalStateException
. -
تشبه الطريقة
int end(String name)
الطريقة السابقة، ولكنها تُرجع موضع النهاية للمطابقة السابقة التي تم العثور عليها للمجموعة المسماةname
. إذا لم تكن المجموعة الملتقطةname
موجودة في القالب، فسيتم طرح استثناءIllegalArgumentException
. إذا لم يقم المحلل بعد بإجراء بحث أو فشلت عملية بحث سابقة، فسيتم طرح استثناءIllegalStateException
.
Pattern p = Pattern.compile("(.(.(.)))");
Matcher m = p.matcher("abcabcabc");
while (m.find())
{
System.out.println("Найдено " + m.group(2));
System.out.println(" начинается с позиции " + m.start(2) +
" и заканчивается на позиции " + (m.end(2) - 1));
System.out.println();
}
مخرجات هذا المثال هي التالية:
Найдено bc
начинается с позиции 1 и заканчивается на позиции 2
Найдено bc
начинается с позиции 4 и заканчивается на позиции 5
Найдено bc
начинается с позиции 7 и заканчивается на позиции 8
أساليب فئة PatternSyntaxException
يصف مثيل للفئةPatternSyntaxException
خطأ في بناء الجملة في التعبير العادي. يطرح هذا الاستثناء من الأساليب compile()
والفئة ، ويتم تشكيله من خلال المُنشئ التالي: يخزن هذا المُنشئ الوصف المحدد ( )، والتعبير العادي ( )، والموضع الذي حدث فيه الخطأ النحوي matches()
. إذا كان موقع الخطأ في بناء الجملة غير معروف، يتم تعيين القيمة إلى . على الأرجح، لن تحتاج أبدًا إلى إنشاء مثيلات لـ . ومع ذلك، سوف تحتاج إلى استخراج القيم المذكورة أعلاه عند إنشاء رسالة خطأ منسقة. للقيام بذلك، يمكنك استخدام الطرق التالية: Pattern
PatternSyntaxException(String desc, String regex, int index)
desc
regex
index
-1
PatternSyntaxException
- تقوم الطريقة
String getDescription()
بإرجاع وصف لخطأ بناء الجملة. - تُرجع الطريقة
int getIndex()
إما الموضع الذي حدث فيه الخطأ، أو -1 إذا كان الموضع غير معروف. - تقوم الطريقة
String getPattern()
بإرجاع تعبير عادي غير صالح.
String getMessage()
بإرجاع سلسلة متعددة الأسطر مع القيم التي تم إرجاعها من الطرق السابقة بالإضافة إلى إشارة مرئية لمكان حدوث الخطأ النحوي في القالب. ما هو الخطأ النحوي؟ فيما يلي مثال: java RegexDemo (?itree Treehouse
في هذه الحالة، نسينا تحديد الحرف التعريفي لقوس الإغلاق ( )
) في تعبير العلامة المتداخل. وهذا هو الناتج من هذا الخطأ:
regex = (?itree
input = Treehouse
Неправильное регулярное выражение: Unknown inline modifier near index 3
(?itree
^
Описание: Unknown inline modifier
Позиция: 3
Неправильный шаблон: (?itree
أنشئ تطبيقات تعبير عادي مفيدة باستخدام Regex API
تمكنك التعبيرات العادية من إنشاء تطبيقات قوية لمعالجة النصوص. في هذا القسم، سنعرض لك تطبيقين مفيدين نأمل أن يشجعوك على استكشاف فئات وطرق Regex API بشكل أكبر. يقدم الملحق الثاني ليكسان: مكتبة أكواد قابلة لإعادة الاستخدام لإجراء التحليل المعجمي.التعبيرات العادية والتوثيق
يعد التوثيق إحدى المهام الإلزامية عند تطوير البرامج الاحترافية. لحسن الحظ، يمكن أن تساعدك التعبيرات العادية في العديد من جوانب إنشاء الوثائق. يستخرج الكود الموجود في القائمة 1 الأسطر التي تحتوي على تعليقات ذات سطر واحد ومتعددة الأسطر على نمط C من ملف مصدر ويكتبها في ملف آخر. لكي يعمل الكود، يجب أن تكون التعليقات على نفس السطر. القائمة 1. استرجاع التعليقاتimport java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
public class ExtCmnt
{
public static void main(String[] args)
{
if (args.length != 2)
{
System.err.println("Способ применения: java ExtCmnt infile outfile");
return;
}
Pattern p;
try
{
// Следующий шаблон определяет многострочные комментарии,
// располагающиеся в одной строке (например, /* одна строка */)
// и однострочные комментарии (например, // Howая-то строка).
// Комментарий может располагаться в любом месте строки.
p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
}
catch (PatternSyntaxException pse)
{
System.err.printf("Синтаксическая ошибка в регулярном выражении: %s%n", pse.getMessage());
System.err.printf("Описание ошибки: %s%n", pse.getDescription());
System.err.printf("Позиция ошибки: %s%n", pse.getIndex());
System.err.printf("Ошибочный шаблон: %s%n", pse.getPattern());
return;
}
try (FileReader fr = new FileReader(args[0]);
BufferedReader br = new BufferedReader(fr);
FileWriter fw = new FileWriter(args[1]);
BufferedWriter bw = new BufferedWriter(fw))
{
Matcher m = p.matcher("");
String line;
while ((line = br.readLine()) != null)
{
m.reset(line);
if (m.matches()) /* Должна соответствовать вся строка */
{
bw.write(line);
bw.newLine();
}
}
}
catch (IOException ioe)
{
System.err.println(ioe.getMessage());
return;
}
}
}
تتحقق الطريقة main()
الموجودة في القائمة 1 أولاً من بناء جملة سطر الأوامر الصحيح ثم تقوم بتجميع تعبير عادي مصمم لاكتشاف التعليقات الفردية والمتعددة الأسطر في كائن فئة Pattern
. إذا لم يتم ظهور أي استثناء PatternSyntaxException
، تفتح الطريقة main()
الملف المصدر، وتنشئ الملف الهدف، وتحصل على مُطابق لمطابقة كل سطر مقروء مقابل النمط، ثم تقرأ الملف المصدر سطرًا تلو الآخر. لكل سطر، يتم مطابقته مع نمط التعليق. إذا نجحت، فستكتب الطريقة main()
السلسلة (متبوعة بسطر جديد) إلى الملف الهدف (سنغطي منطق الإدخال/الإخراج للملف في برنامج تعليمي مستقبلي لـ Java 101). قم بتجميع القائمة 1 كما يلي: javac ExtCmnt.java
قم بتشغيل التطبيق باستخدام الملف ExtCmnt.java
كمدخل: java ExtCmnt ExtCmnt.java out
يجب أن تحصل على النتائج التالية في الملف:
// Следующий шаблон определяет многострочные комментарии,
// располагающиеся в одной строке (например, /* одна строка */)
// и однострочные комментарии (например, // Howая-то строка).
// Комментарий может располагаться в любом месте строки.
p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
if (m.matches()) /* Должна соответствовать вся строка */
في سلسلة النمط .*/\\*.*\\*/|.*//.*$
، يعمل الحرف التعريفي الأنبوبي |
كعامل تشغيل منطقي أو، مما يشير إلى أن المطابق يجب أن يستخدم المعامل الأيسر لبناء التعبير العادي المحدد للعثور على تطابق في نص المطابق. إذا لم تكن هناك أي تطابقات، فإن المطابق يستخدم المعامل الصحيح من بنية التعبير العادي المحددة لمحاولة بحث أخرى (تشكل الأحرف الأولية للأقواس في المجموعة الملتقطة أيضًا عامل تشغيل منطقي). التعبيرات العادية في جافا، الجزء 5
GO TO FULL VERSION