Regex API سان عام پروگرامنگ ڪمن کي آسان ڪريو
ھن آرٽيڪل جي حصن 1 ۽ 2 ۾، توھان کي متعارف ڪرايو ويو آھي باقاعده اظهار ۽ ريجڪس API. توهان ڪلاس جي باري ۾ سکيوPattern
۽ انهن مثالن جي ذريعي هليو جيڪي باقاعده اظهار جي جوڙجڪ کي ظاهر ڪن ٿا، سادي نموني جي ميلاپ کان وٺي لفظي اسٽرنگ استعمال ڪندي وڌيڪ پيچيده ميلاپ تائين رينجز، بائونڊري ميچرز، ۽ مقدار کي استعمال ڪندي. هن ۽ ايندڙ حصن ۾ اسان انهن مسئلن تي غور ڪنداسين جيڪي پهرين حصي ۾ شامل نه آهن، اسان ڪلاسن جي لاڳاپيل طريقن جو مطالعو ڪنداسين Pattern
، Matcher
۽ PatternSyntaxException
. توهان پڻ ٻه افاديتون سکندا جيڪي عام پروگرامنگ مسئلن کي آسان بڻائڻ لاءِ باقاعده اظهار استعمال ڪندا آهن . پهريون هڪ دستاويزن لاءِ ڪوڊ مان رايا ڪڍي ٿو. ٻيو وري قابل استعمال ڪوڊ جي لائبريري آهي جيڪا ليڪسيڪل تجزيي کي انجام ڏيڻ لاءِ تيار ڪئي وئي آهي - گڏ ڪرڻ وارن، مرتب ڪندڙن، ۽ ساڳئي سافٽ ويئر جو هڪ لازمي حصو.
ڊائون لوڊ ڪرڻ جو ذريعو ڪوڊ
توھان حاصل ڪري سگھوٿا سڀ سورس ڪوڊ (جيف فريسن پاران جاوا ورلڊ لاءِ ٺاھيو ويو) ھن آرٽيڪل ۾ ڊيمو ايپليڪيشنن لاءِ ھتي .Regex API سکيا
Pattern
، Matcher
۽ PatternSyntaxException
ٽي طبقا آهن جيڪي ٺاهيندا آهن Regex API. انهن مان هر هڪ طريقا مهيا ڪري ٿو جيڪي توهان کي توهان جي ڪوڊ ۾ باقاعده اظهار استعمال ڪرڻ جي اجازت ڏين ٿا.
نموني جي درجي جا طريقا
ڪلاس جو هڪ مثالPattern
هڪ مرتب ڪيل باقاعده اظهار آهي، جنهن کي پڻ نموني طور سڃاتو وڃي ٿو. باقاعده اظهار مرتب ڪيا ويا آهن نمونن جي ميلاپ جي عملن جي ڪارڪردگي کي بهتر ڪرڻ لاء. هيٺيان جامد طريقا تاليف جي حمايت ڪن ٿا.
Pattern compile(String regex)
مواد کي گڏ ڪري ٿوregex
هڪ وچولي نمائندگي ۾ جيڪو ذخيرو ٿيل آهي نئينPattern
.PatternSyntaxException
اهو طريقو يا ته ڪامياب ٿيڻ جي صورت ۾ هڪ اعتراض جو حوالو ڏئي ٿو، يا جيڪڏهن غلط ريگيولر ايڪسپريشن نحو معلوم ٿئي ٿو ته استثنا ڏئي ٿو . ڪلاس جو ڪو به اعتراضMatcher
استعمال ڪيو ويو آهيPattern
يا هن اعتراض مان موٽايو ويو آهي ان جي ڊفالٽ سيٽنگون، جهڙوڪ ڪيس-حساس ڳولا. مثال طور، ڪوڊ اسنپٽPattern p = Pattern.compile("(?m)^\\.");
هڪ اعتراض ٺاهي ٿوPattern
جيڪو ڊٽ ڪردار سان شروع ٿيندڙ تارن سان ملائڻ لاءِ باقاعده اظهار جي مرتب ڪيل نمائندگي کي محفوظ ڪري ٿو.Pattern compile(String regex, int flags)
ساڳئي مسئلي کي حل ڪري ٿوPattern compile(String regex)
، پر حساب ۾ رکنديflags
: OR قسم جي بٽ جھنڊن لاءِ بٽ مستقل جو هڪ سيٽ. ڪلاسPattern
مسلسل بيان ڪري ٿوCANON_EQ, CASE_INSENSITIVE, COMMENTS, DOTALL, LITERAL, MULTILINE, UNICODE_CASE, UNICODE_CHARACTER_CLASS и UNIX_LINES
جيڪي bitwise OR (مثال طور،CASE_INSENSITIVE | DOTALL
) استعمال ڪندي گڏ ڪري سگھجن ٿا ۽ دليل طور منظور ڪيو ويو آھيflags
.
جي استثناءَ سان
CANON_EQ, LITERAL и UNICODE_CHARACTER_CLASS
، اهي ثابتيون حصو 1 ۾ ڏيکاريل نيسٽڊ پرچم ايڪسپريسشن جو متبادل آهن. جيڪڏهن ڪلاس ۾ بيان ڪيل انهن کان سواءِ هڪ پرچم مستقل سامهون اچي ٿو Pattern
، طريقو Pattern compile(String regex, int flags)
هڪ استثنا ڏئي ٿو java.lang.IllegalArgumentException
. مثال طور، Pattern p = Pattern.compile("^\\.", Pattern.MULTILINE);
پوئين مثال جي برابر، مسلسل Pattern.MULTILINE
۽ nested پرچم جي اظهار سان (?m)
ساڳيو ڪم ڪندي.
Pattern
، ان سان گڏ ان جي استعمال ڪيل جھنڊن سان. هن کي ڪرڻ لاء، توهان هيٺين طريقن کي سڏي سگهو ٿا:
String pattern()
اصل ريگيولر ايڪسپريس اسٽرنگ کي واپس ڪري ٿو جيڪو هڪ ۾ مرتب ڪيو ويو آهيPattern
.int flags()
اعتراض جي پرچم کي واپس ڏئي ٿوPattern
.
Pattern
، اهو عام طور تي استعمال ڪيو ويندو آهي اعتراض حاصل ڪرڻ لاء Matcher
نمونن جي ميلاپ جي عملن کي انجام ڏيڻ لاء. اهو طريقو Matcher matcher(Charsequence input)
هڪ اعتراض ٺاهي ٿو Matcher
جيڪو متن کي ڳولهي ٿو input
هڪ ميچ لاء هڪ اعتراض جي نموني سان Pattern
. جڏهن سڏيو وڃي ٿو، اهو هن اعتراض ڏانهن هڪ حوالو ڏئي ٿو Matcher
. مثال طور، حڪم Matcher m = p.matcher(args[1]);
موٽائي ٿو Matcher
اعتراض لاءِ حوالو Pattern
متغير طرفان p
.
ھڪڙي وقت جي ڳولا |
---|
static boolean matches(String regex, CharSequence input) ڪلاس جو طريقو Pattern توهان کي شيون ٺاهڻ تي محفوظ ڪرڻ جي اجازت ڏئي ٿو Pattern ۽ Matcher ٽيمپليٽ استعمال ڪندي هڪ وقت جي ڳولا. اهو طريقو صحيح موٽائي ٿو جيڪڏهن input نموني سان ملائي regex ، ٻي صورت ۾ اهو غلط موٽائي ٿو. جيڪڏهن باقاعده اظهار ۾ نحو جي غلطي شامل آهي، طريقو هڪ استثنا اڇلائي ٿو PatternSyntaxException . مثال طور، System.out.println(Pattern.matches("[a-z[\\s]]*", "all lowercase letters and whitespace only")); پرنٽ true ، تصديق ڪري ٿو ته جملي all lowercase letters and whitespace only ۾ صرف اسپيس ۽ ننڍا اکر شامل آهن. |
ورهائڻ وارو متن
اڪثر ڊولپرز وٽ گهٽ ۾ گهٽ هڪ ڀيرو لکيل ڪوڊ هوندو آهي ان پٽ ٽيڪسٽ کي ان جي جزو حصن ۾ ٽوڙڻ لاءِ، جيئن ٽيڪسٽ تي ٻڌل ملازم اڪائونٽ کي فيلڊ جي سيٽ ۾ تبديل ڪرڻ. ڪلاسPattern
وڌيڪ آسانيءَ سان حل ڪرڻ جي صلاحيت ڏئي ٿو هن مشڪل ڪم کي ٻن ٽيڪسٽ ورهائڻ جا طريقا استعمال ڪندي:
-
اهو طريقو
String[] split(CharSequence text, int limit)
ورهائي ٿوtext
مليل ميچز جي مطابق اعتراض جي نموني سانPattern
۽ نتيجن کي هڪ صف ۾ واپس ڪري ٿو. ھر صف جو عنصر ھڪڙي متن جي ترتيب کي بيان ڪري ٿو جيڪو ايندڙ ترتيب کان ھڪڙي نموني سان ملندڙ متن جي ٽڪڙي (يا متن جي آخر) کان جدا ٿي ويو آھي. صف جا عناصر ساڳي ترتيب ۾ آهن جنهن ۾ اهي ظاهر ٿيندا آهنtext
.هن طريقي ۾، صفن جي عناصر جو تعداد پيراميٽر تي منحصر هوندو آهي
limit
، جيڪو پڻ ملن جي تعداد کي سنڀاليندو آهي.- هڪ مثبت قدر ڳولهي ٿو نه وڌيڪ ميچن کان وڌيڪ
limit-1
۽ صف جي ڊيگههlimit
عناصر کان وڌيڪ ناهي. - جيڪڏهن قدر منفي آهي، سڀ ممڪن ميچون ڳوليا ويندا آهن، ۽ صف جي ڊيگهه صوابديدي ٿي سگهي ٿي.
- جيڪڏهن قيمت صفر آهي، سڀ ممڪن ميچون ڳولها ويندا آهن، صف جي ڊيگهه صوابديدي ٿي سگهي ٿي، ۽ آخر ۾ خالي لائينون رد ڪيون وينديون آهن.
- هڪ مثبت قدر ڳولهي ٿو نه وڌيڪ ميچن کان وڌيڪ
- طريقو
String[] split(CharSequence text)
اڳئين طريقي کي سڏي ٿو 0 سان حد دليل جي طور تي ۽ ان جي ڪال جو نتيجو واپس ڪري ٿو.
split(CharSequence text)
هڪ ملازم اڪائونٽ کي ورهائڻ جو مسئلو حل ڪرڻ جو نالو، عمر، پوسٽل ايڊريس ۽ تنخواه جي جدا جدا شعبن ۾:
Pattern p = Pattern.compile(",\\s");
String[] fields = p.split("John Doe, 47, Hillsboro Road, 32000");
for (int i = 0; i < fields.length; i++)
System.out.println(fields[i]);
مٿي ڏنل ڪوڊ هڪ باقاعده اظهار کي بيان ڪري ٿو هڪ ڪاما ڪردار ڳولڻ لاء فوري طور تي هڪ واحد اسپيس ڪردار جي پٺيان. هتي ان جي عملدرآمد جا نتيجا آهن:
John Doe
47
Hillsboro Road
32000
ٽيمپليٽ اڳڪٿيون ۽ اسٽريم API
جاوا 8 ۾،Pattern
هڪ طريقو ڪلاس ۾ ظاهر ٿيو . اهو طريقو هڪ پيشڪش ٺاهي ٿو (هڪ فنڪشن هڪ بوليان قدر سان) جيڪو نموني سان ملائڻ لاء استعمال ڪيو ويندو آهي. هن طريقي جو استعمال هيٺ ڏنل ڪوڊ جي ٽڪڙي ۾ ڏيکاريل آهي: Predicate
asPredicate()
List progLangs = Arrays.asList("apl", "basic", "c", "c++", "c#", "cobol", "java", "javascript", "perl", "python", "scala");
Pattern p = Pattern.compile("^c");
progLangs.stream().filter(p.asPredicate()).forEach(System.out::println);
هي ڪوڊ پروگرامنگ ٻولي جي نالن جي هڪ فهرست ٺاهي ٿو، پوء سڀني نالن کي ڳولڻ لاء هڪ نمونو گڏ ڪري ٿو جيڪو خط سان شروع ٿئي ٿو c
. مٿي ڏنل ڪوڊ جي آخري لائن هن فهرست سان گڏ ڊيٽا جي هڪ سيريل وهڪرو حاصل ڪرڻ کي لاڳو ڪري ٿي. اهو هڪ بولين فنڪشن استعمال ڪندي هڪ فلٽر سيٽ ڪري ٿو asPredicate()
جيڪو صحيح موٽائي ٿو جڏهن نالو هڪ خط سان شروع ٿئي ٿو c
۽ اسٽريم ذريعي ٻيهر ورجائي ٿو، ملندڙ نالن کي معياري آئوٽ تي ڇپائي ٿو. ھي آخري لائين ھيٺ ڏنل باقاعده لوپ جي برابر آھي، حصو 1 کان RegexDemo ايپليڪيشن کان واقف آھي.
for (String progLang: progLangs)
if (p.matcher(progLang).find())
System.out.println(progLang);
ملندڙ ڪلاس جا طريقا
ڪلاس جو هڪ مثال ڪلاسMatcher
جي مرتب ڪيل باقاعده اظهار جي تشريح ڪندي اکرن جي تسلسل تي نمونن جي ميلاپ جي عمل کي انجام ڏيڻ لاءِ هڪ ميکانيزم کي بيان ڪري ٿو Pattern
. ڪلاس جون شيون Matcher
مختلف قسم جي نمونن جي ڳولا جي عملن جي مدد ڪن ٿيون:
-
طريقو
boolean find()
ايندڙ ميچ لاءِ ان پٽ ٽيڪسٽ ڳولهي ٿو. اهو طريقو اسڪيننگ شروع ٿئي ٿو يا ته مخصوص متن جي شروعات ۾ يا پوئين ميچ کان پوءِ پهرين ڪردار تي. ٻيو اختيار صرف ممڪن آهي جيڪڏهن هن طريقي جي پوئين ڪال واپس آئي ۽ حل ڪندڙ ري سيٽ نه ڪيو ويو. ڪنهن به صورت ۾، جيڪڏهن ڳولها ڪامياب ٿي وڃي ٿي، بوليان قدر سچو موٽايو ويو آهي. ھن طريقي جو ھڪڙو مثال حصو 1 ۾ ڳولي سگھجي ٿوRegexDemo
. -
طريقو
boolean find(int start)
ميچر کي ري سيٽ ڪري ٿو ۽ ايندڙ ميچ لاء ٽيڪسٽ ڳولي ٿو. ڏسڻ شروع ٿئي ٿو پوزيشن کان بيان ڪيل پيٽرولر طرفانstart
. جيڪڏهن ڳولها ڪامياب ٿي وڃي ته، بولان ويل سچو موٽايو ويندو. مثال طور،m.find(1);
پوزيشن کان شروع ٿيندڙ متن کي اسڪين ڪري ٿو1
(پوزيشن 0 نظر انداز ڪيو ويو آهي). جيڪڏهن پيٽرولر ۾start
منفي قدر يا هڪ قدر شامل آهي ميچر ٽيڪسٽ جي ڊيگهه کان وڌيڪ، طريقو هڪ استثنا اڇلائي ٿوjava.lang.IndexOutOfBoundsException
. -
طريقو
boolean matches()
سڀني متن کي نموني سان ملائڻ جي ڪوشش ڪري ٿو. اهو هڪ بوليان قدر واپس ڏئي ٿو صحيح جيڪڏهن سڀئي متن نموني سان ملن ٿا. مثال طور، ڪوڊPattern p = Pattern.compile("\\w*"); Matcher m = p.matcher("abc!"); System.out.println(p.matches());
ڪڍي ٿوfalse
ڇاڪاڻ ته ڪردار!
هڪ لفظ ڪردار نه آهي. -
طريقو
boolean lookingAt()
مخصوص متن کي نموني سان ملائڻ جي ڪوشش ڪري ٿو. اهو طريقو صحيح موٽائي ٿو جيڪڏهن متن جو ڪو حصو نموني سان ملندو آهي. طريقي جي برعڪسmatches();
، سڀني متن کي نموني سان ملائڻ جي ضرورت ناهي. مثال طور،Pattern p = Pattern.compile("\\w*"); Matcher m = p.matcher("abc!"); System.out.println(p.lookingAt());
اھو ٻاھر نڪرندوtrue
، ڇاڪاڻ ته متن جي شروعاتabc!
صرف لفظ ٺاھيندڙ اکرن تي مشتمل آھي.
Pattern
، طبقاتي شيون Matcher
رياستي معلومات برقرار رکن ٿيون. ڪڏهن ڪڏهن توهان کي ضرورت پئجي سگھي ٿي ته هن معلومات کي صاف ڪرڻ لاءِ ميچر کي ري سيٽ ڪرڻ کان پوءِ نمونن جي ڳولا ختم ٿي وئي آهي. حل ڪندڙ کي ريٽ ڪرڻ لاء هيٺيان طريقا موجود آهن:
-
طريقو
Matcher reset()
ميچر جي حالت کي ري سيٽ ڪري ٿو، بشمول پوزيشن کي ختم ڪرڻ لاء شامل ڪيو وڃي (0 ڏانهن ري سيٽ ڪريو). ايندڙ نمونن جي ڳولا جو عمل شروع ٿئي ٿو ميچر ٽيڪسٽ جي شروعات ۾. موجوده اعتراض ڏانهن حوالو ڏئي ٿوMatcher
. مثال طور،m.reset();
حل ڪندڙ کي ري سيٽ ڪري ٿو جيڪو حوالو ڏنو ويو آهيm
. -
طريقو
Matcher reset(CharSequence text)
حل ڪندڙ رياست کي ري سيٽ ڪري ٿو ۽ نئين حل ڪندڙ ٽيڪسٽ کي سيٽ ڪري ٿوtext
. ايندڙ نمونن جي ڳولا جو عمل نئين ميچر ٽيڪسٽ جي شروعات ۾ شروع ٿئي ٿو. موجوده اعتراض ڏانهن حوالو ڏئي ٿوMatcher
. مثال طور،m.reset("new text");
حوالو حل ڪندڙ کي ري سيٽ ڪري ٿوm
۽ نئين حل ڪندڙ متن کي سيٽ ڪري ٿو"new text"
.
آخر ۾ متن شامل ڪرڻ
آخر ۾ شامل ٿيڻ واري ميچر جي پوزيشن ميچر ٽيڪسٽ جي شروعات کي بيان ڪري ٿي جيڪا قسم جي اعتراض جي آخر ۾ شامل ڪئي وئي آهيjava.lang.StringBuffer
. هيٺيان طريقا هن پوزيشن کي استعمال ڪن ٿا:
-
طريقو ميچر ٽيڪسٽ اکرن کي پڙهي ٿو ۽ انهن کي دليل جي حوالي سان
Matcher appendReplacement(StringBuffer sb, String replacement)
اعتراض جي آخر ۾ شامل ڪري ٿو . اهو طريقو پوئين نموني جي ميچ کان اڳ آخري ڪردار تي پڙهڻ بند ڪري ٿو. اڳيون، طريقو اعتراض جي قسم جي اعتراض مان اکرن کي اعتراض جي آخر تائين شامل ڪري ٿو ( اسٽرنگ شايد پوئين ڳولها دوران قبضو ڪيل متن جي ترتيبن جا حوالا شامل ڪري سگھن ٿا؛ اهي بيان ڪيل ڪردارن ۽ گروپ نمبرن کي استعمال ڪندي پڪڙيا ويا آهن). آخرڪار، طريقو مقرر ڪري ٿو ميچر پوزيشن جي قيمت کي آخري ملندڙ ڪردار پلس ون جي پوزيشن ۾ شامل ڪيو وڃي، ۽ پوء موجوده ميچر جي حوالي سان واپسي.StringBuffer
sb
String
replacement
StringBuffer
replacement
($)
-
اهو طريقو
StringBuffer appendTail(StringBuffer sb)
سڀني متن کي هڪ اعتراض ۾ شامل ڪري ٿوStringBuffer
۽ انهي اعتراض ڏانهن حوالو ڏئي ٿو. آخري طريقي جي ڪال کان پوء ، باقي ٽيڪسٽ کي اعتراض ڏانهن نقل ڪرڻ جوappendReplacement(StringBuffer sb, String replacement)
طريقو ڪال ڪريو .appendTail(StringBuffer sb)
StringBuffer
اهو طريقو Matcher appendReplacement(StringBuffer sb, String replacement)
هڪ استثنا ڏئي ٿو java.lang.IllegalStateException
جيڪڏهن ميچر اڃا تائين هڪ ميچ نه مليو آهي يا اڳوڻي ڳولا جي ڪوشش ناڪام ٿي. اهو هڪ استثنا اڇلائي ٿو IndexOutOfBoundsException
جيڪڏهن لڪير replacement
هڪ گرفتاري گروپ کي بيان ڪري ٿي جيڪا نموني ۾ نه آهي).
قبضو ڪيل گروپ |
---|
جيئن توهان کي ياد آهي ته حصو 1، هڪ ڪيپچر گروپ ڪردارن جو هڪ سلسلو آهي جيڪو قوس ۾ بند ٿيل آهي ( () ) metacharacters. ھن تعمير جو مقصد آھي مليل اکرن کي ذخيرو ڪرڻ لاءِ بعد ۾ ٻيهر استعمال لاءِ نمونن جي ميلاپ دوران. سڀني ڪردارن کي پڪڙيل گروپ مان سمجھيو وڃي ٿو ھڪڙي ھڪڙي ھڪڙي نموني جي ڳولا دوران. |
appendReplacement(StringBuffer sb, String replacement)
۽ طريقن appendTail(StringBuffer sb
جي سڀني واقعن کي مٽائڻ لاءِ ماخذ متن ۾ ڪردار جي ترتيب cat
سان caterpillar
:
Pattern p = Pattern.compile("(cat)");
Matcher m = p.matcher("one cat, two cats, or three cats on a fence");
StringBuffer sb = new StringBuffer();
while (m.find())
m.appendReplacement(sb, "$1erpillar");
m.appendTail(sb);
System.out.println(sb);
هڪ قبضو ڪيل گروپ کي استعمال ڪندي ۽ متبادل متن ۾ ان جو حوالو پروگرام کي ٻڌائي ٿو ته erpillar
هر هڪ واقع ٿيڻ کان پوء داخل ڪرڻ لاء cat
. هن ڪوڊ تي عمل ڪرڻ جو نتيجو هن طرح نظر اچي ٿو: one caterpillar, two caterpillars, or three caterpillars on a fence
متن کي تبديل ڪرڻ
ڪلاسMatcher
اسان کي متن جي متبادل لاءِ ٻه طريقا مهيا ڪري ٿو، مڪمل طور تي appendReplacement(StringBuffer sb, String replacement)
. انهن طريقن کي استعمال ڪندي، توهان يا ته [بدليل متن] جي پهرين واقعن کي تبديل ڪري سگهو ٿا يا سڀني واقعن کي:
-
اهو طريقو
String replaceFirst(String replacement)
ميچر کي ري سيٽ ڪري ٿو، هڪ نئون اعتراض ٺاهي ٿوString
، ميچر ٽيڪسٽ جي سڀني اکرن کي نقل ڪري ٿو (پهريون ميچ تائين) هن اسٽرنگ ۾، ان جي آخر تائين اکرن کي شامل ڪري ٿوreplacement
، باقي اکرن کي نقل ڪري ٿو سٹرنگ ڏانهن ۽ واپس ڪري ٿو هڪ . اعتراضString
(اسٽرنگreplacement
انهن حوالن تي مشتمل ٿي سگھي ٿو جيڪي پوئين ڳولها متن جي ترتيبن دوران ڊالر جي نشانين ۽ قبضو ڪيل گروپ نمبرن کي استعمال ڪندي پڪڙيا ويا). -
طريقو
String replaceAll(String replacement)
ساڳيو طريقي سان هلندي آهيString replaceFirst(String replacement)
، پرreplacement
سڀني مليل ميچز کي اسٽرنگ جي اکرن سان تبديل ڪري ٿو.
\s+
ان پٽ ٽيڪسٽ ۾ هڪ يا وڌيڪ وائيٽ اسپيس اکرن جي ڳولا ڪندو آهي. هيٺ، اسان هن باقاعده اظهار کي استعمال ڪنداسين ۽ هڪ طريقي کي سڏينداسين replaceAll(String replacement)
نقل واري هنڌن کي هٽائڻ لاء:
Pattern p = Pattern.compile("\\s+");
Matcher m = p.matcher("Удаляем \t\t лишние пробелы. ");
System.out.println(m.replaceAll(" "));
هتي نتيجا آهن: Удаляем лишние пробелы.
جاوا ۾ باقاعده اظهار، حصو 4 جاوا ۾ باقاعده اظهار، حصو 5
GO TO FULL VERSION