هڪ باقاعده اظهار ڇا آهي (regex)؟
حقيقت ۾، هڪ باقاعده اظهار متن ۾ هڪ تار ڳولڻ لاء هڪ نمونو آهي. جاوا ۾، هن نموني جي اصل نمائندگي هميشه هڪ تار آهي، يعنيString
طبقي جو هڪ اعتراض. بهرحال، اها ڪا به تار ناهي جنهن کي باقاعده اظهار ۾ مرتب ڪري سگهجي - صرف اهي تار جيڪي باقاعده اظهار ٺاهڻ جي ضابطن جي مطابق هجن. نحو کي ٻولي جي وضاحت ۾ بيان ڪيو ويو آهي. ريگيولر ايڪسپريس اکر ۽ انگن سان گڏ لکجي ويندا آهن، انهي سان گڏ metacharacters، اهي اکر آهن جن کي باقاعده اظهار نحو ۾ خاص معني آهي. مثال طور:
String regex = "java"; // The pattern is "java";
String regex = "\\d{3}"; // The pattern is three digits;
جاوا ۾ باقاعده اظهار ٺاهڻ
جاوا ۾ باقاعده اظهار ٺاهڻ ۾ ٻه سادي قدم شامل آهن:- ان کي هڪ تار جي طور تي لکو جيڪو باقاعده اظهار جي نحو سان مطابقت رکي ٿو؛
- اسٽرنگ کي باقاعده اظهار ۾ گڏ ڪريو؛
Pattern
. هن کي ڪرڻ لاء، اسان کي ڪلاس جي ٻن جامد طريقن مان هڪ کي سڏڻ جي ضرورت آهي: compile
. پهريون طريقو هڪ دليل وٺندو آهي - هڪ اسٽرنگ لفظي جنهن ۾ باقاعده اظهار شامل آهي، جڏهن ته ٻيو هڪ اضافي دليل وٺندو آهي جيڪو نموني سان ملندڙ سيٽنگن کي طئي ڪري ٿو:
public static Pattern compile (String literal)
public static Pattern compile (String literal, int flags)
پيرا ميٽر جي امڪاني قدرن جي فهرست
ڪلاس flags
۾ بيان ڪئي وئي آهي Pattern
۽ اسان وٽ موجود آهي جامد ڪلاس متغير. مثال طور:
Pattern pattern = Pattern.compile("java", Pattern.CASE_INSENSITIVE); // Pattern-matching will be case insensitive.
بنيادي طور تي، Pattern
ڪلاس باقاعده اظهار لاء هڪ تعمير ڪندڙ آهي. هود جي تحت، طريقو هڪ مرتب ڪيل نمائندگي ٺاهڻ لاء ڪلاس جي نجي تعمير ڪندڙ کي compile
سڏيندو آهي . Pattern
هي اعتراض ٺاهڻ واري ميڪانيزم کي هن طريقي سان لاڳو ڪيو ويو آهي ته جيئن ناقابل قابل شيون ٺاهڻ لاء. جڏهن هڪ باقاعده اظهار ٺاهي وئي آهي، ان جي نحو کي جانچيو ويندو آهي. جيڪڏهن اسٽرنگ ۾ غلطيون آهن، پوء هڪ PatternSyntaxException
ٺاهيل آهي.
باقاعده اظهار نحو
باقاعده اظهار نحو<([{\^-=$!|]})?*+.>
اکرن تي ڀاڙي ٿو، جن کي اکرن سان گڏ ڪري سگهجي ٿو. انهن جي ڪردار تي مدار رکندي، اهي ڪيترن ئي گروپن ۾ تقسيم ڪري سگهجي ٿو:
Metacharacter | وصف |
---|---|
^ | هڪ لڪير جي شروعات |
$ | هڪ لڪير جي پڇاڙي |
\b | لفظ جي حد |
\ بي | غير لفظي حد |
\A | داخل ٿيڻ جي شروعات |
\ جي | پوئين ميچ جي پڄاڻي |
\Z | ان پٽ جي پڇاڙي |
\z | ان پٽ جي پڇاڙي |
Metacharacter | وصف |
---|---|
\d | عدد |
\ ڊي | غير عدد |
\s | وائيٽ اسپيس ڪردار |
\ ايس | غير اڇو اسپيس ڪردار |
\w | الفانوميرڪ ڪردار يا انڊر اسڪور |
\W | اکر، انگ، ۽ انڊر اسڪور کانسواءِ ڪو به ڪردار |
. | ڪو به ڪردار |
Metacharacter | وصف |
---|---|
\ t | ٽيب ڪردار |
\n | نئون ڪردار |
\ر | گاڏي واپسي |
\f | linefeed ڪردار |
\u0085 | ايندڙ لائن ڪردار |
\u2028 | لائن جدا ڪندڙ |
\u2029 | پيراگراف جدا ڪندڙ |
Metacharacter | وصف |
---|---|
[abc] | فهرست ڏنل اکرن مان ڪو به (a، b، يا c) |
[^abc] | انهن فهرستن کان سواء ٻيو ڪو به ڪردار (نه a، b، يا c) |
[a-zA-Z] | ضم ٿيل حدون (لاطيني اکر a کان z تائين، ڪيس غير حساس) |
[اشتهار[ايم پي]] | اکرن جو اتحاد (a کان d ۽ m کان p تائين) |
[az&&[def]] | اکرن جا ٽڪرا (d, e, f) |
[az&&[^bc]] | اکرن جي گھٽتائي (a، dz) |
Metacharacter | وصف |
---|---|
؟ | هڪ يا ڪو به |
* | صفر يا وڌيڪ ڀيرا |
+ | هڪ يا وڌيڪ ڀيرا |
{n} | n ڀيرا |
{ن،} | n يا وڌيڪ ڀيرا |
{n،m} | گهٽ ۾ گهٽ n ڀيرا ۽ m کان وڌيڪ نه |
لالچ quantifiers
ھڪڙي شيء توھان کي ڄاڻڻ گھرجي مقدار جي باري ۾ اھو آھي ته اھي ٽن مختلف قسمن ۾ اچن ٿا: لالچي، مالڪ، ۽ ناگزير. توھان quantifier کان پوءِ ھڪڙو "+
" اکر شامل ڪري ھڪڙي مقدار کي مالڪ بڻائيندا آھيو. توهان "" شامل ڪري ان کي لچڪدار بڻائي ڇڏيو ?
. مثال طور:
"A.+a" // greedy
"A.++a" // possessive
"A.+?a" // reluctant
اچو ته هن نموني کي استعمال ڪرڻ جي ڪوشش ڪريون ته مختلف قسم جا مقداري ڪم ڪيئن ٿين ٿا. ڊفالٽ طور، quantifier لالچ آهن. هن جو مطلب آهي ته اهي تار ۾ سڀ کان ڊگهي ميچ ڳوليندا آهن. جيڪڏهن اسان هيٺ ڏنل ڪوڊ هلائيندا آهيون:
public static void main(String[] args) {
String text = "Fred Anna Alexander";
Pattern pattern = Pattern.compile("A.+a");
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println(text.substring(matcher.start(), matcher.end()));
}
}
اسان هن پيداوار حاصل ڪريون ٿا:
Anna Alexa
باقاعده اظهار لاءِ " A.+a
"، نموني سان ملائڻ هن ريت ڪيو ويندو آهي:
-
مخصوص نموني ۾ پهريون اکر لاطيني اکر آهي
A
.Matcher
ان کي متن جي هر ڪردار سان ڀيٽيو، انڊيڪس صفر کان شروع ٿي. ڪردارF
اسان جي ٽيڪسٽ ۾ انڊيڪس صفر تي آهي، تنهنڪريMatcher
اکر جي ذريعي ٻيهر ورجائي ٿو جيستائين اهو نموني سان ملندو. اسان جي مثال ۾، هي ڪردار انڊيڪس 5 تي ملي ٿو. -
هڪ دفعو نموني جي پهرين ڪردار سان هڪ ميچ ملي ٿي،
Matcher
ان جي ٻئي ڪردار سان هڪ ميچ ڳولي ٿو. اسان جي حالت ۾، اهو ".
" ڪردار آهي، جيڪو ڪنهن به ڪردار لاء بيٺل آهي.ڪردار
n
ڇهين پوزيشن ۾ آهي. اهو يقيني طور تي "ڪنهن به ڪردار" لاء هڪ ميچ جي حيثيت رکي ٿو. -
Matcher
نموني جي ايندڙ ڪردار کي جانچڻ لاء اڳتي وڌو. اسان جي نموني ۾، اهو مقدار ۾ شامل ڪيو ويو آهي جيڪو اڳئين ڪردار تي لاڳو ٿئي ٿو: ".+
". ڇاڪاڻ ته اسان جي نموني ۾ "ڪنهن به ڪردار" جي ورجائي جو تعداد هڪ يا وڌيڪ ڀيرا آهي،Matcher
بار بار ايندڙ اکر کي اسٽرنگ مان وٺي ٿو ۽ ان کي نموني جي خلاف چيڪ ڪري ٿو جيستائين اهو "ڪنهن به ڪردار" سان ملندو آهي. اسان جي مثال ۾ - تار جي آخر تائين (انڊيڪس 7 کان انڊيڪس 18 تائين).بنيادي طور تي،
Matcher
تار کي ختم ڪري ڇڏيندو آهي - اهو ئي آهي جيڪو "لالچي" مان مراد آهي. -
جڏهن ميچر ٽيڪسٽ جي آخر تائين پهچندو آهي ۽ نموني جي " " حصي جي چڪاس کي ختم ڪري ٿو
A.+
، اهو باقي نموني جي جانچ ڪرڻ شروع ڪري ٿو:a
. اڳتي وڌڻ جو ڪو وڌيڪ متن نه آھي، تنھنڪري چيڪ اڳتي وڌندو آھي ”بئڪ آف آف“، آخري ڪردار کان شروع ڪندي: -
Matcher
.+
"ياد رکي ٿو" نموني جي "" حصي ۾ ورجائڻ جو تعداد . هن نقطي تي، اهو هڪ جي ڀيٽ ۾ ورهاڱي جو تعداد گھٽائي ٿو ۽ متن جي خلاف وڏي نموني کي چيڪ ڪري ٿو جيستائين هڪ ميچ نه ملي.
مالدار مقدار
مالدار مقدار وارا تمام گهڻا لالچي وانگر آهن. فرق اهو آهي ته جڏهن متن کي اسٽرنگ جي آخر تائين پڪڙيو ويو آهي، اتي "بئڪنگ آف" دوران ڪو به نمونو ملندڙ ناهي. ٻين لفظن ۾، پهرين ٽي مرحلا ساڳيا آهن جيئن لالچي مقدار جي لاء. سڄي تار کي پڪڙڻ کان پوء، ميچر باقي نموني کي شامل ڪري ٿو جيڪو اهو غور ڪري رهيو آهي ۽ ان کي پڪڙيل اسٽرنگ سان مقابلو ڪري ٿو. اسان جي مثال ۾، باقاعده اظهار "A.++a
" استعمال ڪندي، مکيه طريقو ڪو به ميل نه ٿو ملي.
غير ضروري مقدار
-
انهن quantifiers لاء، لالچي قسم جي طور تي، ڪوڊ نموني جي پهرين ڪردار جي بنياد تي هڪ ميچ ڳولي ٿو:
-
پوءِ اهو نمونن جي ايندڙ ڪردار (ڪنهن به ڪردار) سان هڪ ميچ ڳولي ٿو:
-
لالچي نموني جي ميلاپ جي برعڪس، مختصر ترين ميچ جي ڳولا ڪئي ويندي آهي بيچيني نموني جي ميلاپ ۾. هن جو مطلب اهو آهي ته نموني جي ٻئي ڪردار سان هڪ ميچ ڳولڻ کان پوء (هڪ دور، جيڪو متن ۾ پوزيشن 6 تي ڪردار سان ملندو آهي،
Matcher
چيڪ ڪري ٿو ته متن باقي نموني سان ملندو آهي - ڪردار "a
" -
متن نمونن سان نه ٿو ملي (يعني انڊيڪس 7 ۾ اکر "
n
" تي مشتمل آهي)، تنهنڪريMatcher
وڌيڪ هڪ "ڪنهن به ڪردار" کي شامل ڪري ٿو، ڇاڪاڻ ته مقدار جو اشارو هڪ يا وڌيڪ ڏيکاري ٿو. ان کان پوء اهو ٻيهر نمونن جي متن سان پوزيشن 5 کان 8 تائين مقابلو ڪري ٿو:
اسان جي صورت ۾، هڪ ميچ مليو آهي، پر اسان اڃا تائين متن جي آخر تائين نه پهچي چڪا آهيون. تنهن ڪري، نموني سان ملائڻ واري پوزيشن 9 کان ٻيهر شروع ٿئي ٿي، يعني نمونن جو پهريون ڪردار ساڳيو الورورٿم استعمال ڪرڻ لاءِ ڏٺو وڃي ٿو ۽ اهو متن جي آخر تائين ورجائي ٿو.
main
طريقو هيٺ ڏنل نتيجو حاصل ڪري ٿو جڏهن نموني استعمال ڪندي " A.+?a
": Anna Alexa جيئن توهان اسان جي مثال مان ڏسي سگهو ٿا، مختلف قسم جا مقدار ساز ساڳي نموني لاء مختلف نتيجا پيدا ڪن ٿا. تنهن ڪري هن کي ذهن ۾ رکو ۽ صحيح قسم چونڊيو جنهن جي بنياد تي توهان ڳولي رهيا آهيو.
ريگيولر ايڪسپريس ۾ ڪردارن کان فرار
ڇاڪاڻ ته جاوا ۾ هڪ باقاعده اظهار، يا بلڪه، ان جي اصل نمائندگي، هڪ اسٽرنگ لٽريريل آهي، اسان کي اسٽرنگ لٽرلز جي حوالي سان جاوا ضابطن جي حساب ڪرڻ جي ضرورت آهي. خاص طور تي،\
جاوا سورس ڪوڊ ۾ اسٽرنگ لٽرلز ۾ بيڪ سليش اکر " " کي هڪ ڪنٽرول ڪردار جي طور تي تشريح ڪيو ويندو آهي جيڪو مرتب ڪندڙ کي ٻڌائي ٿو ته ايندڙ ڪردار خاص آهي ۽ ان کي خاص طريقي سان تعبير ڪيو وڃي. مثال طور:
String s = "The root directory is \nWindows"; // Move "Windows" to a new line
String s = "The root directory is \u00A7Windows"; // Insert a paragraph symbol before "Windows"
ان جو مطلب اهو آهي ته اسٽرنگ لٽرلز جيڪي باقاعده اظهار کي بيان ڪن ٿا ۽ " \
" اکر استعمال ڪن ٿا (يعني ميٽا اچار کي ظاهر ڪرڻ لاءِ) پٺاڻن کي ٻيهر ورجائڻ گهرجي انهي کي يقيني بڻائڻ لاءِ ته Java bytecode ڪمپائلر تار جي غلط تشريح نه ڪري. مثال طور:
String regex = "\\s"; // Pattern for matching a whitespace character
String regex = "\"Windows\""; // Pattern for matching "Windows"
ڊبل پٺتي پيل خاص اکرن کان بچڻ لاءِ به استعمال ٿيڻ گهرجن جن کي اسان ”عام“ اکرن طور استعمال ڪرڻ چاهيون ٿا. مثال طور:
String regex = "How\\?"; // Pattern for matching "How?"
نموني جي درجي جا طريقا
ڪلاسPattern
۾ باقاعده اظهار سان ڪم ڪرڻ جا ٻيا طريقا آهن:
-
String pattern()
‒ موٽائي ٿو ريگيولر ايڪسپريس جي اصل اسٽرنگ جي نمائندگي جيڪوPattern
اعتراض ٺاهڻ لاءِ استعمال ڪيو ويو آهي:Pattern pattern = Pattern.compile("abc"); System.out.println(pattern.pattern()); // "abc"
-
static boolean matches(String regex, CharSequence input)
- توهان کي چيڪ ڪرڻ جي اجازت ڏئي ٿي باقاعده اظهار جي طور تي منظور ٿيل متن جي خلاف regex طورinput
. واپسي:صحيح - جيڪڏهن متن نموني سان ملندو آهي؛
ڪوڙ - جيڪڏهن اهو نه آهي؛مثال طور:
System.out.println(Pattern.matches("A.+a","Anna")); // true System.out.println(Pattern.matches("A.+a","Fred Anna Alexander")); // false
-
int flags()
‒ موٽائي ٿو پيٽرن جي پيٽرول سيٽ جي قيمتflags
جڏهن نمونو ٺاهيو ويو يا 0 جيڪڏهن پيٽرول سيٽ نه ڪيو ويو. مثال طور:Pattern pattern = Pattern.compile("abc"); System.out.println(pattern.flags()); // 0 Pattern pattern = Pattern.compile("abc",Pattern.CASE_INSENSITIVE); System.out.println(pattern.flags()); // 2
-
String[] split(CharSequence text, int limit)
- پاس ٿيل متن کيString
صف ۾ ورهائي ٿو. پيٽرولرlimit
اشارو ڪري ٿو وڌ ۾ وڌ تعداد جي ميلن جي ڳولها متن ۾:- جيڪڏهن
limit > 0
-limit-1
ملن ٿا؛ - جيڪڏھن
limit < 0
- متن ۾ سڀ ملن ٿا - جيڪڏهن
limit = 0
- متن ۾ سڀئي ملن، صف جي آخر ۾ خالي اسٽرنگ رد ڪيا ويا آهن؛
مثال طور:
public static void main(String[] args) { String text = "Fred Anna Alexa"; Pattern pattern = Pattern.compile("\\s"); String[] strings = pattern.split(text,2); for (String s : strings) { System.out.println(s); } System.out.println("---------"); String[] strings1 = pattern.split(text); for (String s : strings1) { System.out.println(s); } }
ڪنسول آئوٽ:
Fred Anna Alexa --------- Fred Anna Alexa
هيٺ اسان هڪ ٻئي طبقي جي طريقن تي غور ڪنداسين جيڪو
Matcher
اعتراض ٺاهڻ لاء استعمال ڪيو ويو آهي. - جيڪڏهن
ميچر ڪلاس جا طريقا
ڪلاس جا مثالMatcher
نمونن سان ملائڻ لاءِ ٺاهيا ويا آهن. Matcher
باقاعده اظهار لاءِ ”سرچ انجڻ“ آهي. ڳولا ڪرڻ لاءِ، اسان کي ان کي ٻه شيون ڏيڻ گهرجن: هڪ نمونو ۽ هڪ شروعاتي انڊيڪس. Matcher
هڪ اعتراض ٺاهڻ لاء ، Pattern
ڪلاس هيٺ ڏنل طريقو مهيا ڪري ٿو: рublic Matcher matcher(CharSequence input)
طريقو هڪ ڪردار ترتيب وٺندو آهي، جنهن کي ڳولهيو ويندو. هي هڪ ڪلاس جو هڪ مثال آهي جيڪو CharSequence
انٽرفيس کي لاڳو ڪري ٿو. توهان پاس ڪري سگهو ٿا نه صرف هڪ String
، پر پڻ هڪ StringBuffer
, StringBuilder
, Segment
, or CharBuffer
. نموني هڪ Pattern
اعتراض آهي جنهن تي matcher
طريقو سڏيو ويندو آهي. هڪ ميچر ٺاهڻ جو مثال:
Pattern p = Pattern.compile("a*b"); // Create a compiled representation of the regular expression
Matcher m = p.matcher("aaaaab"); // Create a "search engine" to search the text "aaaaab" for the pattern "a*b"
ھاڻي اسان پنھنجي ”سرچ انجڻ“ کي استعمال ڪري سگھون ٿا ميچن کي ڳولڻ لاءِ، متن ۾ ميچ جي پوزيشن حاصل ڪرڻ، ۽ ڪلاس جي طريقن کي استعمال ڪندي متن کي بدلائي سگھون ٿا. طريقو boolean find()
متن ۾ ايندڙ ميچ لاءِ ڏسجي ٿو. اسان ھي طريقو استعمال ڪري سگھون ٿا ۽ ھڪڙي لوپ بيان کي ھڪڙي سڄي متن کي ھڪڙي ايونٽ ماڊل جي حصي طور تجزيو ڪرڻ لاء. ٻين لفظن ۾، اسان ضروري عمل ڪري سگھون ٿا جڏهن ڪو واقعو ٿئي ٿو، يعني جڏهن اسان متن ۾ هڪ ميلاپ ڳوليندا آهيون. مثال طور، اسان متن ۾ ميچ جي پوزيشن کي طئي ڪرڻ لاء هن طبقي int start()
۽ طريقن کي استعمال ڪري سگهون ٿا. int end()
۽ اسان استعمال ڪري سگھون ٿا String replaceFirst(String replacement)
۽ String replaceAll(String replacement)
طريقا استعمال ڪري ميچ کي مٽائڻ جي قيمت سان متبادل پيٽرولر جي. مثال طور:
public static void main(String[] args) {
String text = "Fred Anna Alexa";
Pattern pattern = Pattern.compile("A.+?a");
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
int start=matcher.start();
int end=matcher.end();
System.out.println("Match found: " + text.substring(start, end) + " from index "+ start + " through " + (end-1));
}
System.out.println(matcher.replaceFirst("Ira"));
System.out.println(matcher.replaceAll("Mary"));
System.out.println(text);
}
پيداوار:
Match found: Anna from index 5 through 8
Match found: Alexa from index 10 through 14
Fred Ira Alexa
Fred Mary Mary
Fred Anna Alexa
مثال اهو واضح ڪري ٿو ته replaceFirst
۽ replaceAll
طريقا هڪ نئون String
اعتراض ٺاهي ٿو - هڪ اسٽرنگ جنهن ۾ نمونن سان ملن ٿا اصل متن ۾ متن کي متبادل طور تي طريقي سان منتقل ڪيو ويو دليل جي طور تي. اضافي طور تي، replaceFirst
طريقو صرف پهرين ميچ کي تبديل ڪري ٿو، پر replaceAll
طريقو متن ۾ سڀني ميچين کي تبديل ڪري ٿو. اصل متن باقي رهي ٿو. ۽ طبقن جا سڀ کان وڌيڪ بار Pattern
بار Matcher
ريجڪس آپريشن ڪلاس ۾ ٺهيل آهن String
. اهي طريقا آهن جهڙوڪ split
, matches
, replaceFirst
, and replaceAll
. پر هود جي تحت، اهي طريقا استعمال ڪن ٿا Pattern
۽ Matcher
طبقن. تنهن ڪري جيڪڏهن توهان متن کي تبديل ڪرڻ چاهيو ٿا يا ڪنهن به اضافي ڪوڊ لکڻ کان سواءِ ڪنهن پروگرام ۾ تارن جو مقابلو ڪريو، ڪلاس جا طريقا استعمال ڪريو String
. جيڪڏھن توھان کي وڌيڪ جديد خصوصيتن جي ضرورت آھي، ياد رکو Pattern
۽ Matcher
ڪلاس.
نتيجو
جاوا پروگرام ۾، هڪ باقاعده اظهار جي وضاحت ڪئي وئي آهي هڪ اسٽرنگ جيڪو مخصوص نموني سان ملندڙ ضابطن جي تابعداري ڪري ٿو. جڏهن ڪوڊ تي عمل ڪندي، جاوا مشين هن اسٽرنگ کي هڪPattern
اعتراض ۾ گڏ ڪري ٿي ۽ Matcher
متن ۾ ميچ ڳولڻ لاء اعتراض استعمال ڪري ٿي. جيئن مون شروع ۾ چيو هو، ماڻهو گهڻو ڪري باقاعده اظهار کي بعد ۾ بند ڪري ڇڏيندا آهن، انهن کي هڪ ڏکيو موضوع سمجهي. پر جيڪڏھن توھان سمجھو ٿا بنيادي نحو، مٽا سٽا اکر، ۽ ڪردار فرار ٿيڻ، ۽ مثالن جو مطالعو ڪريو باقاعده اظهار جي، ته پوءِ توھان ڏسندؤ ته اھي ڏاڍا سادو آھن انھن جي ڀيٽ ۾ جيڪي اھي پھرين نظر ۾ نظر اچن ٿا.
وڌيڪ پڙهڻ: |
---|
GO TO FULL VERSION