مشخصات مقاله
-
0
-
0.0
-
6403
-
0
-
0
عبارات با قاعده در جاوا
برای هماهنگی با عبارات معمول جاوا پوشه ی java.util.regex را ارائه می دهد. عبارات معمول (regular expressions) جاوا بسیار مشابه زبان برنامه نویسی Perl می باشد و یادگیری آن نیز بسیار ساده است.
یک عبارت معمولی در واقع یک توالی خاص از کاراکترهایی است که به شما کمک می کند تا با استفاده از یک ترکیب خاص در یک الگو رشته ها یا مجموعه هایی از رشته های دیگر را هماهنگ کرده یا پیدا کنید. آنها می توانند برای جستجو، ویرایش، اجرای متن و داده استفاده شوند.
پوشه ی java.util.regex در درجه ی اول حاوی سه گروه زیر می باشد:
· Pattern Class: یک آبجکت Pattern در واقع نمایی از یک عبارت معمول می باشد. گروه Pattern هیچ سازنده ی عمومی ارائه نمی دهد. برای ایجاد یک الگو، شما باید در ابتدا یکی از متودهای عمومی استاتیک کامپایل را فرابخوانید که در نهایت یک آبجکت Pattern باز خواهد گرداند. این متودها یک عبارت معمول را به عنوان اولین argument می پذیرند.
· Matcher Class: یک آبجکت matcher موتوری است که الگو را تفسیر کرده و هماهنگ سازی عملکردها را در مقابل یک رشته ی ورودی اجرا می کند. گروه Matcher نیز مانند گروه Pattern هیچ سازنده ی عمومی تعریف نمی کند. با فراخوانی متود matcher از یک آبجکت Pattern می توانید یک آبجکت Matcher تنظیم کنید.
· PatternSyntaxException: یک آبجکت PatternSyntaxException یک استثنا چک نشده می باشد که یک ترکیب خطا در یک الگوی عبارت معمول نشان می دهد.
گروه های Capturing:
گروه های Capturing راهی برای روبرو شدن با چند کاراکتر در یک زمان می باشند. این گروه ها با قرار دادن کاراکترها در یک مجموعه از پرانتزها ایجاد می شوند. برای مثال عبارت معمول (dog) یک گروه مجزا حاوی حروف "d", "o", و "g" ایجاد می کند.
تعداد گروه های Capturing با شمردن تعداد پرانتزهای باز شده ی آنها از چپ به راست مشخص می شود. به عنوان مثال در عبارت ((A)(B(C))) چهار گروه این چنینی وجود دارد:
· ((A)(B(C)))
· (A)
· (B(C))
· (C)
برای پی بردن به تعداد گروه های حاضر در عبارت، متود groupCount را در یک آبجکت matcher فرابخوانید. متود groupCount یک int گزارش می دهد که تعداد گروه های capturing را موجود در الگوی matcher نشان می دهد.
یک گروه خاص نیز ، group 0 ، وجود دارد که همیشه کل عبارت را نشان می دهد. این گروه در گزارش کلی مربوط به groupCount وجود ندارد.
مثال:
مثال زیر چگونگی یافتن یک رشته عدد از رشته ی عدد و الفبایی ( alphanumeric ) ارائه شده را توضیح می دهد:
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");
}
}
}
این مثال نتیجه ی زیر را به دنبال خواهد داشت:
Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0
ترکیب عبارت معمول:
در این جدول لیستی از تمام عبارات معمول مربوط به ترکیب متاکاراکتر در جاوا را مشاهده می کنید:
|
Subexpression |
Matches |
|
^ |
شروع خط را هماهنگ می سازد. |
|
$ |
انتهای خط را هماهنگ می کند. |
|
. |
هر کاراکتر مجزا، به جز newline، را هماهنگ می کند. استفاده از گزینه ی m به آن اجازه می دهد تا newline را نیز هماهنگ کند. |
|
[...] |
هر کاراکتر مجزایی را در کروشه ها هماهنگ می سازد. |
|
[^...] |
هر کاراکتر مجزایی را در خارج از کروشه ها هماهنگ می سازد. |
|
\A |
شروع کل رشته. |
|
\z |
پایان کل رشته |
|
\Z |
اتمام کل رشته به جز خط پایانی مجاز |
|
re* |
وقایع عبارت قبل را هماهنگ می سازد. |
|
re+ |
یک مورد یا بیشتر از یک مورد از موارد قبل را هماهنگ می سازد. |
|
re? |
0 یا 1 واقعه از عبارت قبل را هماهنگ می سازد. |
|
re{ n} |
دقیقا تعداد n واقعه از عبارت قبل را هماهنگ می سازد. |
|
re{ n,} |
تعداد n واقعه یا بیشتر از n واقعه را از عبارت قبل هماهنگ می سازد. |
|
re{ n, m} |
حداقل n و حداکثر m واقعه از عبارت قبل را هماهنگ می سازد. |
|
a| b |
a یا b را با یکدیگر هماهنگ می کند. |
|
(re) |
عبارات معمول را گروه بندی کرده و متن هماهنگ شده را به حافظه می سپارد. |
|
(?: re) |
عبارات معمول را بدون به خاطر سپردن متن هماهنگ شده گروه بندی می کند. |
|
(?> re) |
الگوی مستقل را بدون backtracking هماهنگ می کند. |
|
\w |
کاراکترهای لغت را هماهنگ می سازد. |
|
\W |
کاراکترهای غیرلغت (nonword) را هماهنگ می سازد. |
|
\s |
فضای خالی را هماهنگ می سازد. سازگار با [\t\n\r\f] |
|
\S |
فضای غیرسفید (nonwhitespace) را هماهنگ می سازد. |
|
\d |
اعداد را هماهنگ می سازد. همگام با [0-9]. |
|
\D |
غیراعداد (nondigits) را هماهنگ می سازد. |
|
\A |
آغاز یک رشته را هماهنگ می سازد. |
|
\Z |
پایان یک رشته را هماهنگ می سازد، اگر یک newline خارج شود، درست قبل از newline را هماهنگ می سازد. |
|
\z |
انتهای یک رشته را هماهنگ می سازد. |
|
\G |
نقطه ای را که در آن آخرین هماهنگی به پایان می رسد، هماهنگ می سازد. |
|
\n |
بازگشت مرجع به شماره n گروه capture. |
|
\b |
مرزهای کلمات را در خارج از کروشه ها هماهنگ می سازد. Backspace را در داخل کروشه (0x08) هماهنگ می سازد. |
|
\B |
مرزهای غیر لغت را هماهنگ می سازد. |
|
\n, \t, etc. |
Newline، carriage return و tab ها و غیره را هماهنگ می سازد. |
|
\Q |
Escape (quote) all characters up to \E |
|
\E |
Ends quoting begun with \Q |
متودهای گروه Matcher:
در اینجا لیستی از نمونه ی متودهای مفید مشاهده می کنید:
متودهای ایندکس:
متودهای ایندکس مقادیر مفید ایندکس ارائه می دهند که به طور واضح نشان می هند هماهنگی در رشته ی ورودی در کجا پیدا شد:
|
SN |
Methods with Description |
|
1 |
public int start() شروع ایندکس از هماهنگ سازی قبل را بازمی گرداند. |
|
2 |
public int start(int group) طی هماهنگ سازی عملکرد قبل، شروع ایندکس از توالی گرفته شده را با گروه ارائه شده، گزارش می دهد. |
|
3 |
public int end() پس از آخرین کاراکتر هماهنگ شده، افست را گزارش می دهد. |
|
4 |
public int end(int group) پس از آخرین کاراکتر در توالی، که توسط گروه ارائه شده در عملکرد هماهنگ سازی قبلی گرفته شده، افست را گزارش می دهد. |
مطالعه ی متودها:
مطالعه ی متودها رشته ی ورودی را مرور کرده و یک Boolean بازمی گرداند که نشان می دهد آیا الگو پیدا شده یا نه:
|
SN |
Methods with Description |
|
1 |
public boolean lookingAt() سعی می کند تا دنباله ی ورودی را، با شروع در ابتدای ناحیه، در مقابل الگو هماهنگ سازد. |
|
2 |
public boolean find() سعی می کند دنباله بعدی از دنباله ی ورودی را که با الگو هماهنگ می باشد، پیدا کند. |
|
3 |
public boolean find(int start این matcher را مجددا تنظیم می کند تا دنباله ی بعدی از دنباله ی ورودی را که با الگو هماهنگی دارد، پیدا کند، که از ایندکس مشخص شده شروع می کند. |
|
4 |
public boolean matches() سعی می کند کل محدوده را در مقابل الگو هماهنگ کند. |
متودهای جایگزینی (Replacement methods)
متودهای جایگزینی متودهای خوبی برای جایگزینی متن در یک رشته ی ورودی می باشند.
|
SN |
Methods with Description |
|
1 |
public Matcher appendReplacement(StringBuffer sb, String replacement) یک ضمیمه ی non-terminal و جایگزینی مرحله را اجرا می کند. |
|
2 |
public StringBuffer appendTail(StringBuffer sb) یک ضمیمه ی terminal و جایگزینی مرحله را اجرا می کند. |
|
3 |
public String replaceAll(String replacement) هر دنباله از دنباله ی ورودی را که با الگو هماهنگ می باشد، با رشته ی جایگزینی ارائه شده، جایگزین می کند. |
|
4 |
public String replaceFirst(String replacement) اولین دنباله از دنباله ی ورودی را که با الگو هماهنگ می باشد، با رشته ی جایگزینی، جایگزین می کند. |
|
5 |
public static String quoteReplacement(String s) یک رشته ی جایگزینی لیترال برای String مشخص شده بازمی گرداند. این متود یک String تولید می کند که به عنوان یک جایگزینی لیترال در متود appendReplacement از گروه Matcher کار خواهد کرد. |
متودهای start و end:
در زیر مثالی را مشاهده می کنید که تعداد دفعاتی را که لغت cats در رشته ی ورودی ظاهر می شود، نشان می دهد:
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());
}
}
}
این مثال نتایجه ی زیر را به دنبال دارد:
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" منحصرا یک رشته ی فرعی در یک لغت بزرگتر نیستند. همچنین اطلاعات مفیدی در مورد مکانی که در رشته ی ورودی هماهنگ سازی اتفاق افتاده، ارائه می دهد.
متودهای matches و lookingAt:
متودهای matches و lookingAt هر دو تلاش می کنند تا دنباله ی یک ورودی را در مقابل یک الگوهماهنگ سازند. به هرحال تفاوت موجود این است که matches نیاز به هماهنگی کل دنباله ی ورودی دارد، در حالیکه متود lookingAt اینطور نیست.
هر دو متود همیشه در ابتدای رشته ی ورودی شروع می شوند. در اینجا مثالی را می بینید که این قابلیت را توضیح می دهد:
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());
}
}
این مثال نتیجه ی زیر را به دنبال دارد:
Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
lookingAt(): true
matches(): false
متودهای replaceFirst و replaceAll :
متودهای replaceFirst و replaceAll متنی را که بایک عبارت معمول ارائه شده هماهنگ باشد، جایگزین می کنند. همانطور که از نام آنها پیداست، متود replaceFirst اولین واقعه و متود replaceAll تمام وقایع را جایگزین می کند.
در اینجا مثالی را مشاهده می کنید که این قابلیت را توضیح می دهد:
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);
}
}
این مثال نتیجه ی زیر را به دنبال دارد:
The cat says meow. All cats say meow.
متودهای appendReplacement و appendTail:
گروه Matcher متودهای appendReplacement و appendTail را نیز برای جایگزینی متن ارائه می دهد.
در اینجا مثالی را مشاهده می کنید که این قابلیت را توضیح می دهد:
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());
}
}
این مثال نتیجه ی زیر را به دنبال خواهد داشت:
-foo-foo-foo-
متودهای گروه PatternSyntaxException:
یک PatternSyntaxException ، یک استثناء چک نشده می باشد که ترکیب خطا در الگوی یک عبارت معمول نشان می دهد. گروه PatternSyntaxException ، روش های زیر را برای کمک به شما در تعیین اشتباه ارائه می دهد:
|
SN |
Methods with Description |
|
1 |
public String getDescription() توصیف خطا را بازیابی می کند. |
|
2 |
public int getIndex() ایندکس خطا را بازیابی می کند. |
|
3 |
public String getPattern() الگوی خطای عبارت معمول را بازیابی می کند. |
|
4 |
public String getMessage() یک رشته ی چند خطی حاوی توصیف ترکیب خطا و ایندکس آن، الگوی خطای عبارت معمول و یک نمای بصری از خطای ایندکس در داخل الگو را گزارش می دهد. |