التعبير العادي هو نوع من النمط الذي يمكن تطبيقه على النص (سلسلة، في Java). توفر Java الحزمة
java.util.regex لمطابقة التعبيرات العادية. التعبيرات العادية تشبه إلى حد كبير لغة برمجة Perl وهي سهلة التعلم للغاية. التعبير العادي إما يطابق النص (جزء منه) أم لا. * إذا كان التعبير العادي يطابق جزءًا من النص، فيمكننا العثور عليه. ** إذا كان التعبير العادي مركبًا، فيمكننا بسهولة معرفة أي جزء من التعبير العادي يطابق أي جزء من النص.
المثال الأول
يتطابق التعبير العادي "
[a-z] +
" مع جميع الأحرف الصغيرة في النص.
[a-z]
يعني أي حرف من
a
إلى
z
شامل،
+
ويعني حرفًا واحدًا أو أكثر. لنفترض أننا قمنا بتوفير السلسلة "الرمز 2 لتعلم جافا التعليمي". كيفية القيام بذلك في Java أولاً، يجب عليك إنشاء قالب:
import java.util.regex.*;
Pattern p = Pattern.compile(“[a-z]+”);
بعد ذلك عليك إنشاء
matcher
النص عن طريق إرسال رسالة على الرسم التخطيطي:
Matcher m = p.matcher(“code 2 learn java tutorial”);
ملحوظة: لا يوجد أي منشئين
Pattern
،
Matcher
فنحن نقوم بإنشائهما باستخدام أساليب الفصل
Pattern
.
Pattern Class:
يشكل كائن الفئة تمثيلاً للتعبير العادي. لا توفر فئة النمط أي مُنشئات عامة. لإنشاء قالب، يجب عليك أولاً استدعاء إحدى الطرق الثابتة العامة، والتي تقوم بعد ذلك بإرجاع كائن من الفئة
Pattern
. تأخذ هذه الأساليب تعبيرًا عاديًا كوسيطة.
Matcher Class:
كائن Finder هو محرك يفسر النمط وينفذ عمليات المطابقة على سلسلة الإدخال. مثل
Pattern
الفصل الدراسي،
Matcher
لا يوجد به منشئون عامون. يمكنك الحصول على كائن
Matcher
عن طريق استدعاء أسلوب
matcher
على كائن فئة
Pattern
. بمجرد الانتهاء من هذه الخطوات، والآن لدينا مثيل للفئة
Matcher m
، يمكننا الآن التحقق مما إذا كان النمط قد تم العثور عليه أم لا، وإذا كان الأمر كذلك، في أي موضع، وما إلى ذلك.
m.matches()
يُرجع صحيحًا إذا كان النمط يطابق السلسلة بأكملها، ويُرجع خطأً بخلاف ذلك.
m.lookingAt()
يُرجع صحيحًا إذا كان النمط يطابق بداية السلسلة، ويُرجع خطأً بخلاف ذلك.
m.find ()
يُرجع صحيحًا إذا كان النمط يطابق أي جزء من النص.
العثور على المباراة
بعد نجاح المطابقة، ستقوم
m.start() بإرجاع فهرس الحرف الأول المطابق وستعيد
m.end() فهرس الحرف الأخير المطابق بالإضافة إلى واحد. إذا جرت محاولة غير ناجحة ولم يتم العثور على أي تطابق،
m.start()
فسوف
m.end()
يرميون
IllegalStateException
- هذا
RuntimeException
حتى لا تضطر إلى الإمساك به.
قد يبدو من الغريب إرجاع
m.end()
فهرس آخر حرف مطابق بالإضافة إلى واحد، ولكن هذا هو بالضبط ما تفعله معظم
String
.
- على سبيل المثال،
“Now is the time“.substring(m.start(), m.end())
سيعود نفس السلسلة. دعونا نلقي نظرة على الكود:
import java.util.regex.*;
public class RegexTest {
public static void main(String args[]) {
String pattern = "[a-z]+";
String text = "code 2 learn java tutorial";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(text);
while(m.find()) {
System.out.print(text.substring(m.start(), m.end()) + "*");
}
}
}
Output: code*learn*java*tutorial*
طرق إضافية
إذا كان هناك تطابق، ثم:
m.replaceFirst(replacement)
تقوم بإرجاع سلسلة جديدة، حيث سيتم استبدال السلسلة الفرعية الأولى التي تطابق النمط بهاreplacement
m.replaceAll(replacement)
تقوم بإرجاع سلسلة جديدة، حيث سيتم استبدال كل سلسلة فرعية تطابق النمط
m.find(StartIndex)
ابحث عن المطابقة التالية بدءًا من الفهرس المحدد
m.reset()
يعيد تعيين القالب
m.reset(NewText)
يعيد ضبط الباحث ويعطيه نصًا جديدًا (ربما String
، StringBuffer
أو CharBuffer
)
بناء جملة التعبير العادي
^
يطابق بداية السطر.
$
يطابق نهاية السلسلة.
.
يطابق أي حرف واحد باستثناء السطر الجديد. يتيح استخدام الخيار m مطابقة السطر الجديد.
[...]
يطابق أي حرف واحد بين قوسين.
[^ ...]
يطابق أي حرف مفرد ليس بين قوسين.
\A
ابدأ الخط بأكمله.
\z
نهاية السطر بأكمله.
\Z
نهاية السطر بأكمله باستثناء فاصل السطر الأخير.
re*
يطابق 0 أو أكثر من تكرارات التعبير السابق.
re+
مطابقة واحدة أو أكثر للتعبير السابق.
re?
يطابق 0 أو 1 بموقع التعبير السابق.
re{n}
يطابق تمامًا N عدد مرات ظهور التعبير السابق.
re{n,}
يطابق N أو أكثر من تكرارات التعبير السابق.
re{n, m}
يطابق على الأقل n وعلى الأكثر m تكرارات التعبير السابق.
a|b
يطابق أ أو ب.
(re)
مجموعة من التعبيرات العادية وتذكر النص الموجود.
(?: re)
مجموعات من التعبيرات العادية التي لا تتذكر النص الموجود.
(?> re)
يطابق نمطًا مستقلاً بدون عوائد.
\w
يطابق الحروف والأرقام [a-zA-Z_0-9].
\W
هذه ليست حروف أو أرقام.
\s
يطابق المساحات. يعادل [\t\n\r\f].
\S
ليست أحرف مسافة بيضاء.
\d
يطابق الأرقام. يعادل [0-9].
\D
لا يتطابق مع الأرقام.
\G
يطابق نقطة المباراة الأخيرة.
\n
يطابق السطر الجديد.
\b
يتطابق عند حد الكلمة.
\B
التطابقات ليست على حدود الكلمة.
\n, \t, etc.
السطر الجديد، حرف الإرجاع، علامة التبويب، وما إلى ذلك من الأحرف.
\Q
اقتبس كافة الأحرف قبل \E.
\E
بدأ الاقتباس بـ \Q وينتهي.
GO TO FULL VERSION