با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن. و کاربرانی که دوره کامل آموزش برنامه نویسی جاوا را دنبال می کنند. یک عبارت منظم یک دنباله خاصی از کاراکترهایی است که به شما کمک می کند تا رشته ها یا مجموعه های رشته ای را با هم ترکیب کنید یا یک دستورالعمل خاص را که از یک الگوی خاص پیروی می کند را پیدا کنید. آنها می توانند برای جستجو، ویرایش و یا دستکاری متن و داده ها مورد استفاده قرار گیرند. جاوا بسته ی java.util.regex را برای تطابق الگو با عبارات منظم فراهم می کند. عبارات منظم جاوا بسیار شبیه به زبان برنامه نویسی پرل بوده و یادگیری آن نیز بسیار آسان است. برای آشنایی بیشتر با مباحث فوق در ادامه ی آموزش آشنایی با عبارات منظم در جاوا و ساختار کد عبارات منظم با ما همراه باشید.
در ادامه ی آموزش آشنایی با عبارات منظم در جاوا ما شما را با انواع عبارات منظم در جاوا و متدهای آن آشنا خواهیم کرد.
بسته java.util.regex در جاوا، عمدتا از سه کلاس زیر تشکیل شده است:
یک شیء Pattern یک نمایش کامپایل شده از یک عبارت منظم است، که ساختارهای عمومی را ارائه نمی کند.
برای ایجاد شیء Pattern ابتدا باید یکی از متدهای عمومی ()compile را فراخوانی کنید.سپس یک شیء Pattern در اختیار دارید.
یک شی Matcher در واقع موتوری برای تفسیر الگوریتم می باشد.
برای ایجاد یک شیء Matcher نیز باید متد () matcher را فراخوانی کنید تا یک شیء Matcher را برگرداند.
یک شیء PatternSyntaxException یک استثناء بدون کنترل است که یک خطای نحوی در یک الگوی بیان منظم را نشان می دهد.
گروه بندی یکی از راه حل های مفید برای قرار دادن کاراکترهای چندگانه در یک واحد یکتا می باشد.
این کار به راحتی و با قرار دادن کاراکترها در داخل یک پرانتز “()” انجام می شود.
برای مثال عبارت منظم (dog) از کاراکترهای d” “o” و “g” تشکیل شده است.
گروه بندی های چندگانه در پرانتزهای تودرتو به ترتیب از چپ به راست گروه ها تفکیک می شوند.
برای مثال عبارت منظم ((A)(B(C))) شامل گروه های زیر می باشد:
برای پیدا کردن چند گروه در عبارت، متد groupCount را در یک object matcher را فراخوانی کنید.
متد groupCount int تعداد گروه بندی های موجود در matcher را نشان می دهد.
همچنین گروه خاصی به نام group 0 کل عبارت را نشان می دهد که این گروه در گزارشات گروه groupCount نیست.
مثال:
مثال زیر نشان می دهد که چگونه یک رشته رقمی از رشته الفبایی داده شده را پیدا کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { public static void main( String args[] ) { // String to be scanned to find the pattern. String line = "This order was placed for QT3000! OK?"; String pattern = "(.*)(\\d+)(.*)"; // Create a Pattern object Pattern r = Pattern.compile(pattern); // Now create matcher object. Matcher m = r.matcher(line); if (m.find( )) { System.out.println("Found value: " + m.group(0) ); System.out.println("Found value: " + m.group(1) ); System.out.println("Found value: " + m.group(2) ); }else { System.out.println("NO MATCH"); } } } |
اجرای کد فوق در جاوا نتیجه ی زیر را نمایش خواهد داد:
1 2 3 | Found value: This order was placed for QT3000! OK? Found value: This order was placed for QT300 Found value: 0 |
جدول زیر شامل لیست تمام عبارات منظم در جاوا می باشد:
عبارت منظم | کاربرد |
---|---|
^ | آغاز خط را مطابقت می دهد. |
$ | پایاین خط را مطابقت می دهد. |
. | هر کاراکتری را به جز خط جدید وارد می کند. با استفاده از گزینه m امکان آن را به خط جدیدی هم می دهد. |
[...] | کاراکترهای موجود در براکت ها مطابقت می دهد. |
[^...] | کاراکترهایی که در براکت ها نیست را مطابقت می دهد. |
\A | شروع تمام رشته. |
\z | پایان تمام رشته. |
\Z | پایان تمام رشته، به جز محدود کننده خطی مجاز. |
re* | مطابقت ۰ یا کاراکترهای قبلی عبارت |
re+ | مطابقت ۱ یا کاراکترهای قبلی عبارت |
re? | مطابقت ۱ یا ۱ |
re{ n} | n تعداد عبارت منظم قبلی را مطابقت می دهد. |
re{ n,} | مطابقت n تعداد عبارات منظم قبلی یا بیشتر. |
re{ n, m} | مطابقت حداقل n و حداکثر m عبارت منظم |
a| b | مطابقت یک یا دو |
(re) | عبارات منظم گروه ها و متن متناظر آن را برمی گرداند. |
(?: re) | عبارات منظم گروهی بدون یادآوری متن متناسب. |
(?> re) | الگوی مستقل را بدون رد شدن از انطباق، مطابقت می دهد. |
\w | کاراکتر کلمه را مطابقت می دهد. |
\W | کاراکترهای غیرمجاز را مطابقت می دهد. |
\s | فضای سفید را مطابقت می دهد. |
\S | فضاهای غیر سفید را مطابقت می دهد. |
\d | رقم های معادل با [۰-۹] را ارزیابی می کند . |
\D | عبارات غیر رقمی را مطابقت می دهد. |
\A | شروع یک رشته را مطابقت می دهد. |
\Z | پایان رشته را مطابقت می دهد. اگر یک خط جدید وجود داشته باشد، درست قبل از خط جدید را مطابقت می دهد. |
\z | پایان یک رشته را مطابقت می دهد. |
\G | آخرین نقطه ی مطابقت را انجام می دهد. |
\n | بازگشت به مرجع برای گرفتن شماره گروه “n”. |
\b | در خارج از براکت ها، مرز کلمه ها را می سازد. و درون براکتها که قرار می گیرد، پشت سر هم (۰x08) برمی گردد. |
\B | مرزهای غیرمعمول را برآورده می کند. |
\n, \t, etc. | مطابق خطوط جدید، بازده حمل، زبانه ها و غیره |
\Q | (نقل قول) تمام کاراکترها تا \ E. |
\E | پایان نقل قول با \ Q آغاز می شود. |
در اینجا یک لیست از متدهای نمونه مفید است:
متدهای Index مقادیر Index های مفید را نشان می دهند و دقیقا نشان می دهد که کدامیک از آنها در رشته ورودی یافت می شود.
ردیف | متد و توضیحات آن |
---|---|
۱ | public int start() شاخص شروع بازی قبلی را بازمی گرداند. |
۲ | public int start(int group) شروع index از زیر مجموعه ی گروه بندی عبارات منظم است. |
۳ | public int end() بعد از آخرین کاراکتر مطابقت آفست را بر می گرداند. |
۴ | public int end(int group) پایان index از زیر مجموعه ی گروه بندی عبارات منظم است.. |
متدهای مطالعه (Study methods) رشته ورودی را بررسی می کند و یک مقدار بولین را برمی گردانند. که نشان می دهد آیا الگو یافت می شود یا خیر.
ردیف | متد و توضیحات آن |
---|---|
۱ | public boolean lookingAt() تلاش برای مطابقت با توالی ورودی، با شروع از آغاز الگوی pattern |
۲ | public boolean find() تلاش برای پیدا کردن توالی ورودی |
۳ | public boolean find(int start) تلاش برای پیدا کردن توالی ورودی،با شروع از آغاز الگوی pattern |
۴ | public boolean matches() تلاش برای مطابقت کل منطقه الگو pattern. |
متدهای تعویض متدهای مفیدی برای جایگزینی متن در یک رشته ورودی هستند:
ردیف | متد و توضیحات آن |
---|---|
۱ | public Matcher appendReplacement(StringBuffer sb, String replacement) جایگزینی غیر ممکن را اجرا می کند. |
۲ | public StringBuffer appendTail(StringBuffer sb) یک ترمینال اضافه و جایگزین را اجرا می کند. |
۳ | public String replaceAll(String replacement) جایگزین تمام توالی ورودی که منطبق با الگوی رشته جایگزینی است. |
۴ | public String replaceFirst(String replacement) اولین توالی رشته ی ورودی را جایگزین می کند. |
۵ | public static String quoteReplacement(String s) یک رشته ی جایگزین را برای رشته ی String مشخص شده باز می گرداند. |
در زیر نمونه ای است که تعداد دفعاتی که کلمه “cat” در رشته ورودی نمایش داده می شود را شمارش می کند:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { private static final String REGEX = "\\bcat\\b"; private static final String INPUT = "cat cat cat cattie cat"; public static void main( String args[] ) { Pattern p = Pattern.compile(REGEX); Matcher m = p.matcher(INPUT); // get a matcher object int count = 0; while(m.find()) { count++; System.out.println("Match number "+count); System.out.println("start(): "+m.start()); System.out.println("end(): "+m.end()); } } } |
نتیجه ی اجرای کد فوق بصورت زیر خواهد بود:
1 2 3 4 5 6 7 8 9 10 11 12 | Match number 1 start(): 0 end(): 3 Match number 2 start(): 4 end(): 7 Match number 3 start(): 8 end(): 11 Match number 4 start(): 19 end(): 22 |
شما می توانید ببینید که مثال فوق از مرزهای کلمه استفاده می کند تا اطمینان حاصل شود که حروف “c” “a” “t” صرفا یک زیرشاخه در یک کلمه طولانی نیستند.
همچنین اطلاعات مفیدی در مورد موقعیت حروف رشته دارد.
مثال زیر بخوبی عملکرد مطابقت و متدهای دنباله را نشان می دهد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { private static final String REGEX = "foo"; private static final String INPUT = "fooooooooooooooooo"; private static Pattern pattern; private static Matcher matcher; public static void main( String args[] ) { pattern = Pattern.compile(REGEX); matcher = pattern.matcher(INPUT); System.out.println("Current REGEX is: "+REGEX); System.out.println("Current INPUT is: "+INPUT); System.out.println("lookingAt(): "+matcher.lookingAt()); System.out.println("matches(): "+matcher.matches()); } } |
نتیجه ی اجرای کد فوق در جاوا بصورت زیر خواهد بود:
1 2 3 4 | Current REGEX is: foo Current INPUT is: fooooooooooooooooo lookingAt(): true matches(): false |
متدهای replaceFirst و replaceAll متنی را جایگزین می کنند که که با یک عبارت منظم مطابقت دارد.
همانطور که نام آنها نشان می دهد، replaceFirst اولین رخداد را جایگزین می کند و replaceAll همه رخدادها را جایگزین می کند.
مثال زیر بخوبی عملکرد متدهای replaceFirst و replaceAll را نشان می دهد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { private static String REGEX = "dog"; private static String INPUT = "The dog says meow. " + "All dogs say meow."; private static String REPLACE = "cat"; public static void main(String[] args) { Pattern p = Pattern.compile(REGEX); // get a matcher object Matcher m = p.matcher(INPUT); INPUT = m.replaceAll(REPLACE); System.out.println(INPUT); } } |
خروجی مثال فوق در جاوا بصورت زیر خواهد بود:
1 | The cat says meow. All cats say meow. |
کلاس Matcher همچنین متدهای appendReplacement و appendTail را برای جایگزینی متن ارائه می دهد.
مثال زیر بخوبی عملکرد متدهای فوق را نشان می دهد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { private static String REGEX = "a*b"; private static String INPUT = "aabfooaabfooabfoob"; private static String REPLACE = "-"; public static void main(String[] args) { Pattern p = Pattern.compile(REGEX); // get a matcher object Matcher m = p.matcher(INPUT); StringBuffer sb = new StringBuffer(); while(m.find()) { m.appendReplacement(sb, REPLACE); } m.appendTail(sb); System.out.println(sb.toString()); } } |
خروجی کد فوق در جاوا بصورت زیر خواهد بود:
1 | -foo-foo-foo- |
کلاس PatternSyntaxException یک استثناء بدون کنترل است که یک خطای نحوی در یک عبارت منظم را نشان می دهد.
کلاس PatternSyntaxException متد های زیر را ارائه می دهد، که به شما کمک می کند تا بدانید چه اتفاقی افتاده است:
ردیف | متد و توضیحات آن |
---|---|
۱ | public String getDescription() توضیحات خطا را بازیابی می کند. |
۲ | public int getIndex() نمایش خطا را بازیابی می کند. |
۳ | public String getPattern() الگوی بیان منظم اشتباه را بازیابی می کند. |
۴ | public String getMessage() یک رشته چند خطی حاوی توضیحات خطای نحوی و index آن، را برمی گرداند. |
عبارات منظم در جاوا در واقع دنباله خاصی از کاراکترهایی است که به شما کمک می کند تا رشته ها یا مجموعه های رشته ای را با هم ترکیب کنید یا یک دستورالعمل خاص را که از یک الگوی خاص پیروی می کند را پیدا کنید. از این رو یادگیری آن در توسعه انواع برنامه های جاوا مهم بوده و ما مباحث آموزش آشنایی با عبارات منظم در جاوا را به این موضوع اختصاص داده ایم.