1. regex (تعبير عادي): RegularExpressions (استبدال StringTokenizer)؛ أداة قوية لمعالجة السلسلة؛ شائعة في Unix، بل إن Perl أفضل في استخدام regex.
تستخدم بشكل رئيسي في مطابقة السلسلة والبحث والاستبدال. على سبيل المثال: من السهل استخدام مطابقة IP (نطاق أقل من 256) مع التعبيرات العادية؛ واستخراج عدد كبير من عناوين البريد الإلكتروني من صفحات الويب لإرسال رسائل غير مرغوب فيها؛ يحتوي على Matcher (نتيجة مطابقة سلسلة مع نمط) ونمط.
انسخ رمز الكود كما يلي:
/*
* يخبرنا ما إذا كانت هذه السلسلة تتطابق مع التعبير العادي المحدد (سلسلة أيضًا).
*/
System.out.println("abc".matches("..."));// كل "يمثل حرفًا."
انسخ رمز الكود كما يلي:
/*
* استبدل جميع الأرقام في السلسلة بـ "-". تتطلب الطريقة العادية الحكم على charAt واحدًا تلو الآخر؛
* يمثل "//d" أي رقم أو يستبدله بـ "[0-9]"؛
* يمثل "//D" أي رقم غير رقمي أو يتم استبداله بـ "[^0-9]"
*/
System.out.println("ab54564654sbg48746bshj".replaceAll("[0-9]"، "-"));//يمثل كل "."
اثنين،
انسخ رمز الكود كما يلي:
/*
* تجميع يجمع التعبير العادي المحدد في النمط (كل تجميع يستغرق وقتًا)؛ {3} يعني ثلاث مرات بالضبط.
* X{n} X، بالضبط n مرات
* X{n,} X، على الأقل n مرات
* X{n,m} X، على الأقل n مرات، ولكن ليس أكثر من m مرات
*/
النمط p = Pattern.compile("[az]{3}");
Matcher m = p.matcher("ggs");// أنشئ مُطابقًا يطابق الإدخال المحدد بهذا النمط. داخليًا، يتم بالفعل إنشاء إنسان آلي لحالة الأولوية (مبدأ الترجمة)
// السلسلة المراد مطابقتها في المطابق والمطابقات هي في الواقع CharSequence (الواجهة)، لكن السلسلة تنفذ هذه الواجهة ولها تعدد الأشكال
System.out.println(m.matches());// إذا كان "ggss"، فلن يتطابق
// يمكنك دائمًا "ggs".matches("[az]{3}") مباشرةً، ولكن ما ورد أعلاه له مزايا، على الأقل أكثر كفاءة، ويوفر Pattern وMatcher العديد من الوظائف
3. استدعاء Meta Character في regex ".* +"; ctrl + Shift + "/" يعني التعليق، واستبدله بـ "/" لإزالة التعليق.
انسخ رمز الكود كما يلي:
"a".matches(".");//صحيح، "." يمثل أي حرف، بما في ذلك الأحرف الصينية
"aa".matches("aa");// صحيح، وهذا يعني أنه يمكن أيضًا استخدام السلاسل العادية كتعبيرات عادية
/*
* صحيح، "*" تعني 0 حرفًا أو أكثر، ولكن يجب أن تكون الأحرف التالية هي نفس الحرف الأول.
* وإلا فهو خطأ، أي أنه يتم الحكم على ما إذا كانت السلسلة عبارة عن سلسلة مكونة من أحرف مفردة.
*/
"aaaa".matches("a*");
"".matches("a*");//صحيح
"aaa".matches("a؟");//صحيح، مرة واحدة أو 0 مرة
"".matches("أ؟");//صحيح
"أ".matches("أ؟");//صحيح
"544848154564113".matches("//د{3,100}");//صحيح
// هذا هو أبسط حكم IP، ولكن إذا تجاوز 255، فلا يمكن الحكم عليه.
"192.168.0.aaa".matches("//د{1,3}//.//د{1,3}//.//د{1,3}//د{1,3}" );
"192".matches("[0-2][0-9][0-9]");
4. [abc] يعني مطابقة أي حرف؛ [^abc] يعني حرفًا آخر غير abc (يجب أن يكون حرفًا، وسيتم إرجاع خطأ إذا كانت سلسلة فارغة)؛ "[az ]|[AZ]" هو حرف كبير أو صغير معين؛ [AZ&&[ABS]] يعني أيًا من الأحرف الكبيرة وAB.
انسخ رمز الكود كما يلي:
// وجدت أنه لا يوجد فرق بين | و ||، ولكن هناك فرق بين & و && لا أعرف ما إذا كانت هذه هي الطريقة الصحيحة لفهمه.
System.out.println("C".matches("[AZ&&[ABS]]"));//خطأ
System.out.println("C".matches("[AZ&[ABS]]"));//صحيح
System.out.println("A".matches("[AZ&&[ABS]]"));//صحيح
System.out.println("A".matches("[AZ&[ABS]]"));//صحيح
System.out.println("C".matches("[AZ|[ABS]]"));//صحيح
System.out.println("C".matches("[AZ||[ABS]]"));//صحيح
5. /w أحرف الكلمات: [a-zA-Z_0-9] عند مطابقة أسماء المستخدمين؛ أحرف /s الفارغة: [ /t/n/x0B/f/r]؛ /S أحرف غير فارغة: [^/s ] ;/W أحرف غير كلمة: [^/w].
انسخ رمز الكود كما يلي:
" /n/t/r".matches("//s{4}");//true
" ".matches("//S");//false
"a_8".matches("//ث{3}");//صحيح
//"+" تعني مرة واحدة أو عدة مرات
"abc888&^%".matches("[az]{1,3}//d+[&^#%]+");//صحيح
/*
* الحرف المراد مطابقته هو مجرد شرطة مائلة عكسية، ولكن لا يمكن كتابته كـ "/" ثم دمجه مع ما يلي "،
* السابقة "لا يمكن المطابقة ستؤدي إلى CE.
* لا يمكن أن يتبعه "//"، وإلا سيحدث خطأ في وقت التشغيل (لا توجد مشكلة في الترجمة)، يجب كتابته كـ "////"
*/
System.out.println("//".matches("////"));//true
6. فئة أحرف POSIX (US-ASCII فقط)
انسخ رمز الكود كما يلي:
/p{Lower} أحرف أبجدية صغيرة: [az] ;/p{Upper} أحرف أبجدية كبيرة: [AZ] ;/p{ASCII} جميع ASCII: [/x00-/x7F] ;/p{Alpha} أحرف أبجدية: [/p{Lower}/p{Upper}] ;/p{Digit} رقم عشري: [0-9].
7. مُطابق الحدود
^ بداية السطر $ نهاية السطر/ب حد الكلمة/ب حد غير الكلمة/أ بداية الإدخال/G نهاية المطابقة السابقة/Z نهاية الإدخال، يستخدم فقط للفاصل الأخير (إن وجد)
/z نهاية الإدخال
انسخ رمز الكود كما يلي:
"hello world".matches("^h.*");// بداية السطر ^
"hello world".matches(".*ld$");// نهاية السطر $
"hello world".matches("^h[az]{1,3}o//b.*");///bword border
"helloworld".matches("^h[az]{1,3}o//b.*");
" /n".matches("^[//s&&[^//n]]*//n$");// الحكم على الأسطر الفارغة التي تبدأ بحرف فارغ
8. يمكنك أيضًا استخدام m.start() وm.end() ضمن طريقة البحث لإرجاع الموضع التالي بين موضع البداية وموضع النهاية؛ إذا تعذر العثور عليه، فسيحدث خطأ.
انسخ رمز الكود كما يلي:
النمط p = Pattern.compile("//d{3,5}");
سلسلة s = "133-34444-333-00"؛
المطابق م = p.matcher(s);
m.matches();//تطابق التطابقات جميع السلاسل
m.reset();
/*
* إذا تم استدعاء طريقة إعادة التعيين أولاً أدناه، فسيتم إخراج صحيح، صحيح، صحيح، خطأ.
* وبخلاف ذلك، فإن النتيجة قبل الأخيرة تظهر أيضًا خطأ.
*الأسباب هي كما يلي:
* التطابقات تتطابق مع أول "-" وتكتشف أنها غير متطابقة، ولكن تم أكل هذه الأحرف الأربعة وستبدأ المطابقة مرة أخرى
* يبدأ 34444، ويبدأ البحث الثاني من 333، لأن البحث يطابق التسلسل التالي.
* تتيح طريقة إعادة الضبط لأعواد الثقاب إخراج الخيط الذي تأكله أعواد الثقاب.
* خلاصة الأمر: يجب استخدام إعادة الضبط بين التطابقات والعثور، لأنها تؤثر على بعضها البعض
*
*/
م. البحث ()؛
م. البحث ()؛
m.find();// حاول العثور على التسلسل التالي لتسلسل الإدخال الذي يطابق هذا النمط
م. البحث ()؛
/*
* محاولات مطابقة تسلسل الإدخال بدءًا من بداية المنطقة بهذا النمط.
* انتقد مؤلف كتاب Thinking in Java هذه الطريقة بشدة لأنه ليس من الواضح من الكلمات أين تبدأ المطابقة.
* كل ما يلي صحيح، لأنه يبدأ من الصفر في كل مرة
*/
m.lookingAt();
m.lookingAt();
m.lookingAt();
m.lookingAt();
9. استبدال السلسلة
انسخ رمز الكود كما يلي:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
الطبقة العامة TestRegexReplacement {
public static void main(String[] args) {
Pattern p = Pattern.compile("java",Pattern.CASE_INSENSITIVE);// المعلمة التالية عبارة عن عدد صحيح، مما يعني "غير حساس لحالة الأحرف"
Matcher m = p.matcher("Java java hxsyl Ilovejava java JaVaAcmer");
بينما (م. البحث ()) {
System.out.println(m.group());//m.group سوف يقوم بإخراج كل جافا (تجاهل حالة الأحرف)
}
String s = m.replaceAll("Java");// تحتوي السلسلة أيضًا على هذه الطريقة
System.out.println(s);
m.reset();// يجب إضافته لأن البحث والمطابقة يؤثران على بعضهما البعض
StringBuffer sb = new StringBuffer();
كثافة العمليات ط = 0؛
/*
* الطريقة التالية هي استبدال الرقم الفردي لجافا الموجود بـ "Java" والرقم الزوجي بـ "java"
*/
بينما (م. البحث ()) {
أنا++;
// لا يمكن كتابته مباشرةً كـ i&1 ويجب تحويله إلى قيمة منطقية
إذا((ط&1)==1) {
m.appendReplacement(sb, "Java");
}آخر {
m.appendReplacement(sb, "java");
}
}
m.appendTail(sb);// أضف السلسلة المتبقية بعد العثور على آخر جافا
System.out.println(sb);// بدون إعادة التعيين، يتم إخراج Acmer فقط
}
}
10. التجمع
انسخ رمز الكود كما يلي:
/*
* أضف الأقواس على التوالي، دون احتساب القوس الخارجي، أول قوس على اليسار هو المجموعة الأولى
*/
النمط p = Pattern.compile("(//د{3,5})([az]{2})");
سلسلة s = "123aaa-77878bb-646dd-00";
المطابق م = p.matcher(s);
بينما (م. البحث ()) {
System.out.println(m.group());
System.out.println(m.group(1));// إخراج كل زوج من الأرقام المتطابقة
System.out.println(m.group(2));// إخراج كل زوج من الحروف المطابقة
}
11. التقاط رسائل البريد الإلكتروني من صفحات الويب
انسخ رمز الكود كما يلي:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
استيراد java.io.FileReader؛
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* إذا كنت بحاجة إلى أي طريقة للرفع، يرجى تقديم اسم الطريقة أولاً.
* ثم يسرد ctrl + 1 التوصيات ويقوم النظام بإنشاء هذه الطريقة
*/
الطبقة العامة EmailSpider {
public static void main(String[] args) {
// TODO طريقة تم إنشاؤها تلقائيًا stub
يحاول {
BufferedReader br = new BufferedReader(new FileReader("F://regex.html"));
سطر السلسلة = ""؛
يحاول {
بينما ((line=br.readLine())!=null) {
حل(خط);
}
} قبض (IOException ه) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}
} قبض على (FileNotFoundException ه) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}
}
حل الفراغ الثابت الخاص (خط السلسلة) {
// TODO طريقة تم إنشاؤها تلقائيًا stub
// إذا كان التعبير العادي لا يفي بالوظيفة المقابلة، فلن يرتكب خطأ لأنه عبارة عن سلسلة.
Pattern p = Pattern.compile("[//w[.-]]+@[//w[.-]]+//.[//w]+");
المطابق م = p.matcher(line);
بينما (م. البحث ()) {
System.out.println(m.group());
}
}
}
12. إحصائيات الكود
انسخ رمز الكود كما يلي:
عرض الرمز
/*
* حساب عدد الأسطر الفارغة وأسطر التعليق وأسطر البرنامج في الكود
* في الواقع، يمكنك أيضًا استخدام startWith وendsWith في String.
* إذا تم استخدامه من قبل مدير المشروع، فمن الضروري أيضًا حساب ما إذا كان عدد الأحرف في كل سطر ينتهي بـ {؛ لمنع الكسل
*/
import java.io.BufferedReader;
استيراد java.io.File؛
import java.io.FileNotFoundException;
استيراد java.io.FileReader؛
import java.io.IOException;
الطبقة العامة CoderCount {
خطوط عادية طويلة ثابتة = 0 ؛
خطوط التعليق الطويلة الثابتة = 0؛
خطوط بيضاء طويلة ثابتة = 0؛
public static void main(String[] args) {
File f = new File("D://share//src");
File[] codeFiles = f.listFiles();
لـ (الملف الفرعي: ملفات الكود) {
إذا (child.getName().matches(".*//.java$")) {
حل(الطفل);
}
}
System.out.println("normalLines:" +normalLines);
System.out.println("commentLines:" + commentLines);
System.out.println("whiteLines:" + WhiteLines);
}
حل الفراغ الثابت الخاص (ملف f) {
BufferedReader br = null;
تعليق منطقي = خطأ؛
يحاول {
br = new BufferedReader(new FileReader(f));
سطر السلسلة = ""؛
while((line = br.readLine()) != null) {
/*
* // تحتوي بعض أسطر التعليقات على علامة تبويب أمامها
* لا يمكن الكتابة بعد readLine
* السطر الأخير سيكون مؤشرًا فارغًا
*/
الخط = الخط.تريم ()؛
// readLine يزيل السطر الجديد بعد قراءة السلسلة.
إذا (line.matches("^[//s&&[^//n]]*$")) {
WhiteLines++;
} else if (line.startsWith("/*") && !line.endsWith("*/")) {
commentLines++;
تعليق = صحيح؛
} else if (line.startsWith("/*") && line.endsWith("*/")) {
commentLines++;
} وإلا إذا (صحيح == تعليق) {
commentLines++;
إذا (line.endsWith("*/")) {
تعليق = خطأ؛
}
} else if (line.startsWith("//")) {
commentLines++;
} آخر {
NormalLines++;
}
}
} قبض على (FileNotFoundException ه) {
printStackTrace();
} قبض (IOException ه) {
printStackTrace();
} أخيراً {
إذا (ر != فارغة) {
يحاول {
br. Close();
br = null;
} قبض (IOException ه) {
printStackTrace();
}
}
}
}
}
13. محددات الكمية
يشمل؟ *+; الافتراضي هو الجشع، وكذلك المتردد والمتملك (حصريًا).
انسخ رمز الكود كما يلي:
// تمت إضافة المجموعة لرؤيتها بشكل أكثر وضوحًا.
النمط p = Pattern.compile("(.{3,10})+[0-9]");
String s = "aaaa5bbbb6";// الطول 10
المطابق م = p.matcher(s);
/*
* الآن قم بإخراج 0-10، الإعداد الافتراضي هو Greedy، ابتلع 10 أحرف أولاً، واكتشف أنها غير متطابقة، ثم أخرج واحدًا منها، واكتشف أنها متطابقة؛
* إذا أصبح Pattern.compile("(.{3,10}?)+[0-9]") مترددًا، فسوف يبتلع ثلاثة أحرف أولاً، ويبحث عن عدم تطابق، ويستمر في الابتلاع حتى يتطابق، ويخرج 0 إلى 5؛
* إذا كان Pattern.compile("(.{3,10}++)+[0-9]") ملكية (حصريًا)، فإنه يبتلع أيضًا 10 أحرف أولاً، لكنه لا يبصقها، فلن يطابقها ,
* تستخدم هذه الطريقة بشكل أساسي عندما تكون هناك حاجة إلى كفاءة عالية (سيكون هناك أخطاء).
*/
إذا (م. تجد ()) {
System.out.println(m.start() + "----" + m.end());
}آخر {
System.put.println("غير متطابق!");
}
14. الملحق (مجموعة غير ملتقطة)
انسخ رمز الكود كما يلي:
// معنى المجموعة غير الملتقطة هو عكس المعنى الحرفي، وهو ما يعني الالتقاط إذا كان مطابقًا
النمط p = Pattern.compile("(?=a).{3}");
/*
* الإخراج a66، وهو ما يعادل المطالبة بالبدء بـ a. يمكنك أيضًا كتابة Pattern.compile("[a].{2}");
* إذا كان Pattern.compile(".{3}(؟!=a)") لا ينتهي بـ {2}[^a]، ولكن الحرف التالي ليس (lookahead)، فسيتم إخراج 44a و66b، لذلك هذا الاستخدام غير شائع الاستخدام؛
* إذا كان Pattern.compile(".{3}(?=a)")، فسيُخرج 444 (لأن ?=a عبارة عن مظهر أمامي). إذا تم وضعه في المقدمة، فسيتم تضمينه في المجموعة ، وإذا وضع في الخلف فلا يدخل في المجموعة؛
*
*
*/
سلسلة ق = "444a66b"؛
المطابق م = p.matcher(s);
بينما (م. البحث ()) {
System.out.println(m.group());
}
15. المرجع الخلفي
انسخ رمز الكود كما يلي:
النمط p = Pattern.compile("(//d//d)//1");
/*
* الإخراج صحيح، // 1 يعني نفس المجموعة الأولى، سيكون من الخطأ إذا تم تغييره إلى 1213؛
* إذا كان Pattern.compile("(//d(//d))//2")، فيجب تغييره إلى 122.
*
*/
سلسلة س = "1212"؛
المطابق م = p.matcher(s);
System.out.println(m.matches());
16. اختصار الأعلام
"." لا يتطابق مع الأسطر الجديدة، فقط تذكر CASE_INSENSITIVE، يمكن أيضًا تمكين الاختصار "المطابقة غير الحساسة لحالة الأحرف من خلال تعبير العلامة المضمن (؟i)".