تحدد التعبيرات العادية أنماط السلاسل.
يمكن استخدام التعبيرات العادية للبحث عن النص أو تحريره أو معالجته.
لا تقتصر التعبيرات العادية على لغة واحدة، بل هناك اختلافات دقيقة في كل لغة.
تعبيرات Java العادية هي الأكثر تشابهًا مع تعبيرات Perl.
تتضمن الحزمة java.util.regex بشكل أساسي الفئات الثلاث التالية:
فئة النمط:
كائن النمط هو تمثيل مجمع للتعبير العادي. لا تحتوي فئة النمط على مُنشئ عام. لإنشاء كائن نمط، يجب عليك أولاً استدعاء طريقة الترجمة الثابتة العامة الخاصة به، والتي تقوم بإرجاع كائن نمط. تقبل هذه الطريقة التعبير العادي كمعلمة أولى.
فئة المطابق:
كائن Matcher هو محرك يفسر ويطابق سلاسل الإدخال. مثل فئة النمط، لا يوجد لدى Matcher مُنشئ عام. تحتاج إلى استدعاء أسلوب المطابقة لكائن Pattern للحصول على كائن Matcher.
استثناء بناء الجملة:
PatternSyntaxException هي فئة استثناء غير إلزامية تمثل خطأ في بناء الجملة في نمط التعبير العادي.
تعد مجموعات الالتقاط طريقة للتعامل مع الأحرف المتعددة كوحدة واحدة، ويتم إنشاؤها عن طريق تجميع الأحرف بين قوسين.
على سبيل المثال، يقوم التعبير العادي (الكلب) بإنشاء مجموعة واحدة تحتوي على "d" و"o" و"g".
يتم ترقيم مجموعات الالتقاط عن طريق حساب الأقواس المفتوحة من اليسار إلى اليمين. على سبيل المثال، في التعبير ((A)(B(C)))، هناك أربع مجموعات من هذا القبيل:
((أ)(ب(ج)))
(أ)
(قبل الميلاد))
(ج)
يمكنك التحقق من عدد المجموعات التي يحتوي عليها التعبير عن طريق استدعاء الأسلوب groupCount للكائن المطابق. تقوم طريقة groupCount بإرجاع قيمة int، مما يشير إلى أن كائن المطابقة يحتوي حاليًا على مجموعات التقاط متعددة.
هناك أيضًا مجموعة خاصة (المجموعة 0) تمثل دائمًا التعبير بأكمله. لم يتم تضمين المجموعة في القيمة المرجعة لـ groupCount.
يوضح المثال التالي كيفية العثور على سلسلة من الأرقام من سلسلة معينة:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
RegexMatches من الفئة العامة
{
الفراغ الثابت العام الرئيسي( String args[] ){
// ابحث في السلسلة وفقًا للنمط المحدد String line = "تم تقديم هذا الطلب لـ QT3000! حسنًا؟";
نمط السلسلة = "(.*)(\d+)(.*)";
// إنشاء كائن نمط Pattern r = Pattern.compile(pattern);
// الآن قم بإنشاء كائن مطابق Matcher m = r.matcher(line);
إذا (م. تجد ( ) ) {
System.out.println("القيمة التي تم العثور عليها: " + m.group(0) );
System.out.println("القيمة التي تم العثور عليها: " + m.group(1) );
System.out.println("القيمة التي تم العثور عليها: " + m.group(2) );
} آخر {
System.out.println("لا يوجد تطابق");
}
}
}
نتائج التجميع والتشغيل للمثال أعلاه هي كما يلي:
القيمة التي تم العثور عليها: تم تقديم هذا الطلب لـ QT3000، حسنًا؟
القيمة التي تم العثور عليها: تم تقديم هذا الطلب لـ QT300
القيمة التي تم العثور عليها: 0
شخصية | يوضح |
---|---|
| قم بتمييز الحرف التالي كحرف خاص أو نص أو مرجع خلفي أو حرف هروب ثماني. على سبيل المثال، "n" يطابق الحرف "n". "n" يطابق حرف السطر الجديد. التسلسل "\" يطابق ""، و"(" يطابق "(". |
^ | يطابق بداية سلسلة الإدخال. إذا تم تعيين الخاصية Multiline لكائن RegExp ، فسيطابق ^ أيضًا الموضع بعد "n" أو "r". |
$ | يطابق نهاية سلسلة الإدخال. إذا تم تعيين الخاصية Multiline لكائن RegExp ، فسيطابق $ أيضًا الموضع قبل "n" أو "r". |
* | يطابق الحرف السابق أو التعبير الفرعي صفرًا أو أكثر. على سبيل المثال، zo* يطابق "z" و"zoo". * يعادل {0،}. |
+ | يطابق الحرف أو التعبير الفرعي السابق مرة واحدة أو أكثر. على سبيل المثال، يتطابق "zo+" مع "zo" و"zoo" ولكن ليس "z". + يعادل {1،}. |
؟ | يطابق الحرف السابق أو التعبير الفرعي صفر أو مرة واحدة. على سبيل المثال، "do(es)؟" يتطابق مع "do" أو "do" في "dos". يعادل {0,1}. |
{ ن } | n هو عدد صحيح غير سالب. تطابق بالضبط مرات n . على سبيل المثال، "o{2}" لا يتطابق مع "o" في "Bob"، ولكنه يطابق كلا من "o" في "food". |
{ ن ,} | n هو عدد صحيح غير سالب. تطابق على الأقل n مرات. على سبيل المثال، "o{2,}" لا يطابق "o" في "Bob"، ولكنه يطابق كل o في "foooood". "o{1,}" يعادل "o+". "o{0,}" يعادل "o*". |
{ ن , م } | M و n أعداد صحيحة غير سالبة، حيث n <= m . تطابق على الأقل n مرات وعلى الأكثر m مرات. على سبيل المثال، يطابق "o{1,3}" الأحرف الثلاثة الأولى في "fooooood". "س{0,1}" يعادل "س؟". ملاحظة: لا يمكنك إدراج مسافات بين الفواصل والأرقام. |
؟ | عندما تتبع هذه الشخصية مباشرة أي مؤهل آخر (*، +، ?، { n }، { n ,}، { n , m })، يكون نمط المطابقة "غير جشع". يتطابق النمط "غير الجشع" مع أقصر سلسلة ممكنة، بينما يتطابق النمط "الجشع" الافتراضي مع أطول سلسلة ممكنة. على سبيل المثال، في السلسلة "oooo"، يتطابق "o+؟" مع حرف "o" واحد فقط، بينما يتطابق "o+" مع جميع حروف "o". |
. | يطابق أي حرف مفرد باستثناء "rn". لمطابقة أي حرف بما في ذلك "rn"، استخدم نمطًا مثل "[sS]". |
( نمط ) | يطابق النمط ويلتقط التعبير الفرعي المطابق. يمكن استرجاع التطابقات التي تم التقاطها من مجموعة "التطابقات" الناتجة باستخدام السمات $0...$9 . لمطابقة حرف القوس ( )، استخدم "(" أو ")". |
(؟: نمط ) | تعبير فرعي يطابق النمط ولكنه لا يلتقط المطابقة، أي أنه تطابق غير ملتقط ولا يخزن المطابقة لاستخدامها لاحقًا. يعد هذا مفيدًا عند دمج أجزاء النمط باستخدام الحرف "أو" (|). على سبيل المثال، يعد التعبير 'industr(?:y|ies) تعبيرًا اقتصاديًا أكثر من التعبير 'industry|industries'. |
(؟= النمط ) | تعبير فرعي يقوم بإجراء بحث أمامي يطابق سلسلة في بداية سلسلة تتطابق مع النمط . إنها تطابق غير ملتقط، أي تطابق لا يمكن التقاطه لاستخدامه لاحقًا. على سبيل المثال، يتطابق 'Windows (?=95|98|NT|2000)' مع "Windows" في "Windows 2000" ولكن ليس "Windows" في "Windows 3.1". لا تشغل رؤوس التنبؤ أحرفًا، أي أنه بعد حدوث المطابقة، يتم البحث عن المطابقة التالية مباشرة بعد المطابقة السابقة، وليس بعد الأحرف التي تشكل رؤوس التنبؤ. |
(؟! نمط ) | تعبير فرعي يقوم بإجراء بحث خلفي يطابق سلسلة بحث ليست في بداية سلسلة تطابق النمط . إنها تطابق غير ملتقط، أي تطابق لا يمكن التقاطه لاستخدامه لاحقًا. على سبيل المثال، يتطابق 'Windows (؟!95|98|NT|2000)' مع "Windows" في "Windows 3.1" ولكن ليس "Windows" في "Windows 2000". لا تشغل رؤوس التنبؤ أحرفًا، أي أنه بعد حدوث المطابقة، يتم البحث عن المطابقة التالية مباشرة بعد المطابقة السابقة، وليس بعد الأحرف التي تشكل رؤوس التنبؤ. |
س | | تطابق x أو y . على سبيل المثال، يتطابق 'z|food' مع "z" أو "food". '(z|f)ood' يطابق "zood" أو "food". |
[ سيز ] | مجموعة الأحرف. يطابق أي حرف موجود في . على سبيل المثال، "[abc]" يطابق "a" في "عادي". |
[^ زيز ] | عكس مجموعة الأحرف. يطابق أي أحرف غير مدرجة. على سبيل المثال، يتطابق "[^abc]" مع "p" و"l" و"i" و"n" في "plain". |
[ من الألف إلى الياء ] | نطاق الأحرف. يطابق أي حرف ضمن النطاق المحدد. على سبيل المثال، يطابق "[az]" أي حرف صغير في النطاق من "a" إلى "z". |
[^ من الألف إلى الياء ] | حرف النطاق العكسي. يطابق أي حرف لا يقع ضمن النطاق المحدد. على سبيل المثال، يتطابق "[^az]" مع أي حرف غير موجود في النطاق من "a" إلى "z". |
ب | يطابق حدود الكلمة، أي الموضع بين الكلمة والمسافة. على سبيل المثال، "erb" يطابق "er" في "أبدًا"، ولكن ليس "er" في "الفعل". |
ب | مطابقة الحدود غير الكلمة. "erB" يطابق "er" في "الفعل"، ولكن ليس "er" في "أبدًا". |
ج س | يطابق حرف التحكم المشار إليه بواسطة x . على سبيل المثال، يتطابق cM مع Control-M أو حرف إرجاع إلى أول السطر. يجب أن تكون قيمة x بين AZ أو az. إذا لم يكن الأمر كذلك، فمن المفترض أن يكون c هو الحرف "c" نفسه. |
د | مطابقة الأحرف الرقمية. يعادل [0-9]. |
د | يطابق الأحرف غير الرقمية. يعادل [^0-9]. |
و | تطابقات خلاصة النموذج. يعادل x0c و cL. |
n | مطابقة السطر الجديد. أي ما يعادل x0a و cJ. |
ص | يطابق حرف إرجاع. يعادل x0d وcM. |
س | يطابق أي حرف مسافة بيضاء، بما في ذلك المسافات وعلامات التبويب وموجزات النماذج وما إلى ذلك. يعادل [fnrtv]. |
س | يطابق أي حرف غير المسافة البيضاء. يعادل [^fnrtv]. |
ر | مطابقة علامة التبويب. أي ما يعادل x09 و cI. |
v | مطابقة علامة التبويب العمودية. يعادل x0b و cK. |
ث | يطابق أي نوع من الأحرف، بما في ذلك الشرطة السفلية. يعادل "[A-Za-z0-9_]". |
د | يطابق أي حرف غير الكلمة. يعادل "[^A-Za-z0-9_]". |
x ن | يطابق n ، حيث n هو رمز هروب سداسي عشري. يجب أن يتكون رمز الهروب السداسي العشري من رقمين بالضبط. على سبيل المثال، "x41" يطابق "A". "x041" يعادل "x04"&"1". السماح برموز ASCII في التعبيرات العادية. |
رقم | يطابق num ، حيث num عدد صحيح موجب. مرجع خلفي لالتقاط المباراة. على سبيل المثال، يطابق "(.)1" حرفين متطابقين متتاليين. |
ن | يحدد رمز الهروب الثماني أو المرجع الخلفي. إذا كان n مسبوقًا بـ n على الأقل من التعبيرات الفرعية الملتقطة، فإن n يعد مرجعًا خلفيًا. بخلاف ذلك، إذا كان n رقمًا ثمانيًا (0-7)، فإن n هو رمز الهروب الثماني. |
نانومتر | يحدد رمز الهروب الثماني أو المرجع الخلفي. إذا كان nm مسبوقًا بتعابير فرعية ملتقطة على الأقل nm ، فإن nm يعد مرجعًا خلفيًا. إذا كان nm مسبوقًا بـ n على الأقل من عمليات الالتقاط، فإن n هو مرجع خلفي متبوع بالحرف m . إذا لم يكن أي من الشرطين السابقين موجودًا، فإن nm يطابق القيمة الثماني nm ، حيث n و m عبارة عن أرقام ثماني (0-7). |
نمل | عندما يكون n رقمًا ثمانيًا (0-3) ويكون m و l رقمًا ثمانيًا (0-7)، قم بمطابقة رمز الهروب الثماني nml . |
ش ن | يطابق n ، حيث n هو حرف Unicode يتم تمثيله كرقم سداسي عشري مكون من أربعة أرقام. على سبيل المثال، u00A9 يطابق رمز حقوق الطبع والنشر (©). |
توفر طريقة الفهرس قيم فهرس مفيدة تشير بالضبط إلى مكان وجود المطابقة في سلسلة الإدخال:
رقم سري | الطرق والتعليمات |
---|---|
1 | public int start() تقوم بإرجاع الفهرس الأولي للمطابقة السابقة. |
2 | public int start(int group) يُرجع الفهرس الأولي للتسلسل الذي تم التقاطه بواسطة المجموعة المحددة أثناء عملية المطابقة السابقة |
3 | تقوم الدالة public int end() بإرجاع الإزاحة بعد آخر حرف مطابق. |
4 | public int end(int group) يُرجع الإزاحة بعد الحرف الأخير من التسلسل الذي تم التقاطه بواسطة المجموعة المحددة أثناء عملية المطابقة السابقة. |
تقوم طريقة البحث بفحص سلسلة الإدخال وإرجاع قيمة منطقية تشير إلى ما إذا تم العثور على النمط:
رقم سري | الطرق والتعليمات |
---|---|
1 | يحاول البحث المنطقي العام () مطابقة تسلسل الإدخال الذي يبدأ من بداية النطاق بهذا النمط. |
2 | يحاول البحث المنطقي العام () العثور على التسلسل التالي لتسلسل الإدخال الذي يطابق هذا النمط. |
3 | البحث المنطقي العام (int start) يعيد تعيين هذا المطابق ثم يحاول العثور على التسلسل التالي لتسلسل الإدخال بدءًا من الفهرس المحدد الذي يطابق هذا النمط. |
4 | تحاول التطابقات المنطقية العامة () مطابقة النطاق بأكمله بالنمط. |
طريقة الاستبدال هي طريقة لاستبدال النص في سلسلة الإدخال:
رقم سري | الطرق والتعليمات |
---|---|
1 | يقوم appendReplacement (StringBuffer sb، String استبدال) بتنفيذ خطوات الإضافة والاستبدال غير الطرفية. |
2 | يقوم StringBuffer appendTail (StringBuffer sb) العام بتنفيذ خطوات الإضافة والاستبدال الطرفية. |
3 | سلسلة استبدال الكل العامة (استبدال السلسلة) تستبدل كل تسلسل فرعي لتسلسل الإدخال الذي يتطابق نمطه مع سلسلة الاستبدال المحددة. |
4 | استبدال السلسلة العامة (استبدال السلسلة) يستبدل التسلسل الفرعي الأول لتسلسل الإدخال الذي يتطابق نمطه مع سلسلة الاستبدال المحددة. |
5 | تقوم سلسلة quoteReplacement العامة الثابتة (String s) بإرجاع سلسلة الاستبدال الحرفية للسلسلة المحددة. تقوم هذه الطريقة بإرجاع سلسلة تعمل تمامًا مثل السلسلة الحرفية التي تم تمريرها إلى طريقة appendReplacement لفئة Matcher. |
فيما يلي مثال لحساب عدد مرات ظهور كلمة "cat" في سلسلة إدخال:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
RegexMatches من الفئة العامة
{
سلسلة نهائية ثابتة خاصة REGEX = "\bcat\b";
سلسلة نهائية ثابتة خاصة INPUT =
"قطة قطة قطة قطة قطة" ؛
الفراغ الثابت العام الرئيسي( String args[] ){
النمط p = Pattern.compile(REGEX);
Matcher m = p.matcher(INPUT); // احصل على كائن المطابقة int count = 0;
بينما (م. البحث ()) {
العد++;
System.out.println("رقم المطابقة"+count);
System.out.println("start(): "+m.start());
System.out.println("end(): "+m.end());
}
}
}
نتائج التجميع والتشغيل للمثال أعلاه هي كما يلي:
المباراة رقم 1
البداية (): 0
النهاية (): 3
المباراة رقم 2
البداية (): 4
النهاية (): 7
المباراة رقم 3
البداية (): 8
النهاية (): 11
المباراة رقم 4
البداية (): 19
النهاية (): 22
يمكنك أن ترى أن هذا المثال يستخدم حدود الكلمات للتأكد من أن الأحرف "c" و"a" و"t" ليست مجرد سلسلة فرعية من كلمة أطول. كما يوفر أيضًا بعض المعلومات المفيدة حول مكان حدوث المطابقة في سلسلة الإدخال.
تقوم طريقة البداية بإرجاع الفهرس الأولي للتسلسل الذي تم التقاطه بواسطة المجموعة المحددة أثناء عملية المطابقة السابقة، وتضيف طريقة النهاية واحدًا إلى فهرس آخر حرف مطابق.
يتم استخدام كل من أساليب التطابقات والنظر في محاولة مطابقة نمط تسلسل الإدخال. والفرق بينهما هو أن المطابقات تتطلب مطابقة التسلسل بأكمله، بينما لا يتطلب الأمر lookAt ذلك.
غالبًا ما يتم استخدام هاتين الطريقتين في بداية سلسلة الإدخال.
نستخدم المثال التالي لشرح هذه الوظيفة:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
RegexMatches من الفئة العامة
{
سلسلة نهائية ثابتة خاصة REGEX = "foo";
سلسلة نهائية ثابتة خاصة INPUT = "fooooooooooooooooo"؛
نمط نمط ثابت خاص؛
المطابق الثابت الخاص؛
الفراغ الثابت العام الرئيسي( String args[] ){
Pattern = Pattern.compile(REGEX);
matcher = Pattern.matcher(INPUT);
System.out.println("REGEX الحالي هو:"+REGEX);
System.out.println("الإدخال الحالي هو:"+INPUT);
System.out.println("lookingAt(): "+matcher.lookingAt());
System.out.println("matches(): "+matcher.matches());
}
}
نتائج التجميع والتشغيل للمثال أعلاه هي كما يلي:
REGEX الحالي هو: foo
الإدخال الحالي هو: fooooooooooooooo
أبحث في (): صحيح
التطابقات (): خطأ
يتم استخدام أساليب استبدال الأول واستبدال الكل لاستبدال النص الذي يتطابق مع تعبير عادي. الفرق هو أن ReplaceFirst يستبدل التطابق الأول وreplaceAll يستبدل كل التطابقات.
يوضح المثال التالي هذه الوظيفة:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
RegexMatches من الفئة العامة
{
سلسلة ثابتة خاصة REGEX = "كلب"؛
سلسلة ثابتة خاصة INPUT = "الكلب يقول مواء." +
"كل الكلاب تقول مواء.";
سلسلة ثابتة خاصة استبدال = "قطة"؛
public static void main(String[] args) {
النمط p = Pattern.compile(REGEX);
// الحصول على كائن مطابق
المطابق م = p.matcher(INPUT);
INPUT = m.replaceAll(REPLACE);
System.out.println(INPUT);
}
}
نتائج التجميع والتشغيل للمثال أعلاه هي كما يلي:
القطة تقول مواء كل القطط تقول مواء.
توفر فئة Matcher أيضًا أساليب appendReplacement وappendTail لاستبدال النص:
انظر إلى المثال التالي لشرح هذه الوظيفة:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
RegexMatches من الفئة العامة
{
سلسلة ثابتة خاصة REGEX = "a*b";
سلسلة ثابتة خاصة INPUT = "aabfooaabfooabfoob"؛
سلسلة ثابتة خاصة استبدال = "-"؛
public static void main(String[] args) {
النمط p = Pattern.compile(REGEX);
// احصل على كائن المطابقة Matcher m = p.matcher(INPUT);
StringBuffer sb = new StringBuffer();
بينما (م. البحث ()) {
m.appendReplacement(sb,REPLACE);
}
m.appendTail(sb);
System.out.println(sb.toString());
}
}
نتائج التجميع والتشغيل للمثال أعلاه هي كما يلي:
-فو-فو-فو-
PatternSyntaxException هي فئة استثناء غير مفروضة تشير إلى خطأ في بناء الجملة في نمط التعبير العادي.
توفر فئة PatternSyntaxException الطرق التالية لمساعدتنا في معرفة الأخطاء التي حدثت.
رقم سري | الطرق والتعليمات |
---|---|
1 | السلسلة العامة getDescription() تحصل على وصف الخطأ. |
2 | يحصل public int getIndex() على فهرس خاطئ. |
3 | تحصل السلسلة العامة getPattern() على نمط التعبير العادي الخاطئ. |
4 | تقوم String getMessage() العامة بإرجاع سلسلة متعددة الأسطر تحتوي على وصف لخطأ بناء الجملة وفهرسه، ونمط التعبير العادي للخطأ، وإشارة مرئية لفهرس الخطأ في النمط. |