مقدمة
ستقدم هذه المقالة فئة الأنماط وفئة المطابقة في تعبيرات Java العادية. بادئ ذي بدء ، نحتاج إلى أن نفهم بوضوح أنه يجب أولاً تجميع التعبير العادي المحدد كسلسلة كمثيل لفئة النمط. لذلك ، فإن كيفية فهم هاتين الفئتين بشكل أفضل أمر يجب على المبرمجين معرفته.
دعونا نلقي نظرة على هاتين الفئتين:
1. مفهوم التقاط المجموعة
يمكن ترقيم مجموعة الالتقاط عن طريق حساب أقواسها المفتوحة من اليسار إلى اليمين ، والتي تبدأ بـ 1. على سبيل المثال ، في التعبير ((أ) (ب (ج))) ، هناك أربع مجموعات من هذا القبيل:
1 ((أ) (ب (ج))) 2 (أ) 3 (ب (ج)) 4 (ج)
مجموعة الأصفار الجماعية تمثل دائمًا التعبير بأكمله. المجموعات التي تبدأ بـ (؟) هي مجموعات غير مؤهلة نقية لا تلتقط النص ولا تعتمد على تعداد التحرير والسرد.
إن إدخال الالتقاط المرتبط بمجموعة هو دائمًا ما يطابق المجموعة مؤخرًا. إذا تم حساب المجموعة مرة أخرى بسبب القياس الكمي ، فسيتم الاحتفاظ بقيمة تم التقاطها مسبقًا في فشل الحساب الثاني (إن وجد). على سبيل المثال ، سيقوم مطابقة السلسلة "ABA" بالتعبير (A (B)؟)+ تعيين المجموعة الثانية على "B". في بداية كل مباراة ، يتم التخلص من جميع المدخلات التي تم التقاطها.
2. شرح مفصل للنمط والمطابقة
يتم تنفيذ تعبيرات Java العادية من خلال فئة الأنماط وفئة المطابقة ضمن حزمة java.util.regex (يوصى بفتح وثيقة Java API عند قراءة هذه المقالة. عند تقديم الطريقة التي يتم تقديمها ، تحقق من وصف الطريقة في واجهة برمجة تطبيقات Java ، وسيكون التأثير أفضل).
يتم استخدام فئة الأنماط لإنشاء تعبير منتظم ، أو يمكن قوله لإنشاء نمط مطابقة. طريقة البناء الخاصة بها خاصة ولا يمكن إنشاؤها مباشرة ، ولكن يمكن أن تنشئ تعبيرًا منتظمًا من خلال طريقة المصنع البسيطة لـ Pattern.complie(String regex)
مثال رمز Java:
نمط p = pattern.compile ("// w+") ؛ p.pattern () ؛ // return/w+ pattern() إرجاع نموذج السلسلة للتعبير العادي ، وهو في الواقع معلمة regex من Pattern.complile(String regex)
1.pattern.split (إدخال charsequence)
يحتوي النمط على طريقة split(CharSequence input) ، والتي يتم استخدامها لفصل السلاسل وإرجاع سلسلة []. أعتقد أن String.split(String regex) يتم تنفيذها من خلال Pattern.split(CharSequence input) .
مثال رمز Java:
نمط p = pattern.compile ("// d+") ؛ String [] str = p.split ("My QQ هو: 456456 هاتفي هو: 0532214 بريدي الإلكتروني هو: [email protected]") ؛النتيجة: str [0] = "my qq هو:" str [1] = "هاتفي هو:" str [2] = "البريد الإلكتروني هو: [email protected]"
2. pattern.matcher (regex string ، charsequence input) هي طريقة ثابتة تستخدم لمطابقة السلاسل بسرعة. هذه الطريقة مناسبة للمطابقة مرة واحدة فقط ومطابقة جميع الأوتار.
مثال رمز Java:
pattern.matches ("// d+" ، "2223") ؛ // return true pattern.matches ("// d+" ، "2223aa") ؛3.pattern.Matcher (إدخال charsequence)
بعد قول الكثير ، إنه أخيرًا دور فئة المطابقة لاول مرة. Pattern.matcher(CharSequence input) إرجاع كائن المطابقة.
طريقة مُنشئ فئة المطابقة خاصة أيضًا ولا يمكن إنشاؤها حسب الرغبة. يمكن أن تحصل فقط على مثيلات من هذه الفئة من خلال طريقة Pattern.matcher(CharSequence input) .
يمكن لفئة الأنماط القيام فقط ببعض عمليات المطابقة البسيطة. من أجل الحصول على عمليات مطابقة منتظمة أقوى وأكثر ملاءمة ، من الضروري التعاون مع النمط والمطابقة. توفر فئة المطابقة دعم التجميع للتعبيرات العادية ودعم مطابقة متعددة للتعبيرات العادية.
مثال رمز Java:
نمط p = pattern.compile ("// d+") ؛ Matcher M = P.Matcher ("22bb23") ؛ m.pattern () ؛ // return p وهذا هو إرجاع كائن النمط الذي تم إنشاؤه بواسطة كائن المطابقة.4.matcher.matches ()/matcher.lokingat ()/matcher.find ()
يوفر فئة المطابقة ثلاث طرق تشغيل مطابقة. جميع الطرق الثلاثة تعود نوع منطقي. العودة صحيحا عند الوصول إلى المباراة. إذا لم يكن هناك تطابق ، فإنه يعود خطأ.
matches() يطابق السلسلة بأكملها ، وتُرجع صحيحًا فقط إذا تطابق السلسلة بأكملها
مثال رمز Java:
نمط p = pattern.compile ("// d+") ؛ Matcher M = P.Matcher ("22bb23") ؛ M.Matches () ؛ // return false ، لأنه لا يمكن مطابقة BB بواسطة/d+، مما يؤدي إلى مطابقة السلسلة بأكملها غير ناجحة. Matcher M2 = P.Matcher ("2223") ؛ m2.matches () ؛ // إرجاع صحيح ، لأن/d+ يطابق السلسلة بأكملها دعونا ننظر إلى الوراء في Pattern.matcher(String regex,CharSequence input) ، وهو ما يعادل الكود التالي
Pattern.compile(regex).matcher(input).matches()
يطابق lookingAt() السلسلة السابقة ، ويُرجع صحيحًا فقط إذا كانت السلسلة المطابقة في المقدمة.
مثال رمز Java:
نمط p = pattern.compile ("// d+") ؛ Matcher M = P.Matcher ("22bb23") ؛ m.lokingat () ؛ // return true ، لأن/d+ يطابق 22 مطابقة سابقة M2 = p.matcher ("AA2223") ؛ m2.lokingat () ؛ // إرجاع خطأ ، لأن/d+ لا يمكن أن يتطابق مع AA السابق find() تطابق السلسلة ، ويمكن أن تكون السلسلة المطابقة في أي مكان.
مثال رمز Java:
نمط p = pattern.compile ("// d+") ؛ Matcher M = P.Matcher ("22bb23") ؛ M.Find () ؛ // return true matcher m2 = p.matcher ("AA2223") ؛ m2.find () ؛ // return true matcher m3 = p.matcher ("AA2223BB") ؛ m3.find () ؛ // return true matcher m4 = p.matcher ("aabb") ؛ m4.find () ؛ // إرجاع خطأ5.mathcer.start ()/matcher.end ()/matcher.group ()
بعد استخدام matches() و lookingAt() و find() لإجراء عمليات مطابقة ، يمكنك استخدام الطرق الثلاثة المذكورة أعلاه للحصول على مزيد من المعلومات التفصيلية.
start() إرجاع موضع الفهرس للفرعية المطابقة في السلسلة.
end() إرجاع موضع الفهرس في الحرف الأخير من السلسلة المتطابقة في السلسلة.
group() إرجاع السلسلة الفرعية المطابقة
مثال رمز Java:
نمط p = pattern.compile ("// d+") ؛ Matcher M = P.Matcher ("AAA2223BB") ؛ M.Find () ؛ // Match 2223 M.Start () ؛ // return 3 M.End () ؛ // Return 7 ، رقم الفهرس بعد 2223 M.Group () ؛ // Return 2223 Mathcer M2 = M.Matcher ("2223bb") ؛ m.lokingat () ؛ // Match 2223 M.Start () ؛ // return 0 ، نظرًا لأن Lookingat () يمكن أن تطابق فقط السلسلة السابقة ، عند استخدام Lookingat () لمطابقة ، فإن طريقة Start () تُرجع دائمًا 0 m.end () ؛ // return 4 m.group () ؛ // Return 2223 Matcher M3 = M.Matcher ("2223bb") ؛ M.Matches () ؛ // تطابق السلسلة بأكملها m.start () ؛ // return 0 ، أعتقد أن الجميع يعرف السبب M.End () ؛ // Return 6 ، أعتقد أن الجميع يعرف السبب ، لأن Matches () يحتاج إلى مطابقة جميع الأوتار M.Group () ؛ // إرجاع 2223BB بعد قوله كثيرًا ، أعتقد أن الجميع يفهم استخدام الأساليب المذكورة أعلاه. يجب أن نتحدث عن كيفية استخدام تجميع التعبير المنتظم في Java.
هناك طريقة مثقلة لـ start() و end() و group() إنها start(int i) ، end(int i) ، group(int i) خصيصًا لعمليات المجموعة. لدى فئة Mathcer أيضًا مجموعة groupCount() لإرجاع عدد المجموعات الموجودة.
مثال رمز Java:
pattern p = pattern.compile ("([[az]+) (// d+)") ؛ Matcher M = P.Matcher ("AAA2223BB") ؛ M.Find () ؛ // Match AAA2223 M.GroupCount () ؛ // Return 2 ، لأن هناك مجموعتان من M.Start (1) ؛ // إرجاع 0 إرجاع رقم الفهرس للمجموعة الأولى من الأساسيات المتطابقة في السلسلة M.Start (2) ؛ // Returns 3 M.End (1) ؛ // إرجاع 3 إرجاع موضع الفهرس في الحرف الأخير للمجموعة الأولى من الأساسيات المتطابقة في السلسلة. M. end (2) ؛ // إرجاع 7 m.group (1) ؛ // Returns AAA ، إرجاع المجموعة الأولى من Substrings M.Group (2) ؛ // إرجاع 2223 ، إرجاع المجموعة الثانية من الأساسيات المطابقة الآن ، دعنا نستخدم عملية مطابقة منتظمة ذات مستوى أعلى قليلاً ، على سبيل المثال ، هناك نص مع العديد من الأرقام فيه ، ويتم فصل هذه الأرقام. الآن نحتاج إلى إخراج جميع الأرقام في النص. من السهل جدًا استخدام عمليات Java العادية.
مثال رمز Java:
نمط p = pattern.compile ("// d+") ؛ Matcher M = P.Matcher ("My QQ هو: 456456 هاتفي هو: 0532214 بريدي الإلكتروني هو: [email protected]") ؛ بينما (m.find ()) {system.out.println (M.Group ()) ؛ }الإخراج:
456456 0532214 123
إذا استبدلت ما سبق while() حلقة مع
بينما (m.find ()) {system.out.println (M.Group ()) ؛ system.out.print ("start:"+m.start ()) ؛ System.out.println ("End:"+M.End ()) ؛ }ثم الإخراج:
456456 البدء: 6 النهاية: 12 0532214 البدء: 19 النهاية: 26 123 البدء: 36 النهاية: 39
الآن يجب أن يعلم الجميع أنه بعد كل عملية مطابقة ، سيتم تغيير قيم الأساليب الثلاثة start() ، end() ، group() ، وسيتم تغييرها إلى معلومات فرعية مطابقة ، وسيتم تغيير أساليب التحميل الزائد إلى المعلومات المقابلة.
ملاحظة: فقط عندما تكون عملية المطابقة ناجحة ، يمكنك استخدام الطرق الثلاثة start() ، end() ، و group() ، وإلا فإن java.lang.IllegalStateException سيتم طرحها ، أي عندما matches() ، lookingAt() ، find() عائد صحيح ، لا يمكن استخدامه إلا.
لخص
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون محتوى هذه المقالة من بعض المساعدة في دراستك أو عملك. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل. شكرا لك على دعمك إلى wulin.com.