عبارات باقاعده (Regex) روشی برای توصیف مجموعهای از رشتهها بر اساس ویژگیهای مشترک بین آنها هستند. از آنها میتوان برای جستجو، ویرایش یا دستکاری متن و داده استفاده کرد. برای ساخت عبارات باقاعده باید نحوهی خاصی را بیاموزید که فراتر از نحو عادی زبان برنامهنویسی جاوا است. عبارات باقاعده از نظر پیچیدگی متفاوت هستند، اما وقتی اصول ساختشان را بفهمید، میتوانید هر عبارت باقاعدهای را رمزگشایی (یا بسازید) کنید.
در دنیای عبارات باقاعده، انتخابهای متفاوتی وجود دارد، مانند grep، Perl، Tcl، Python، PHP و awk. نحو عبارات باقاعده در java.util.regex API بیشترین شباهت را به نحو Perl دارد.
پکیج java.util.regex عمدتاً از سه کلاس تشکیل شده است: Pattern، Matcher و PatternSyntaxException.
شیء Pattern نمایش کامپایلشدهی یک عبارت باقاعده است. کلاس Pattern Constructor عمومی ندارد. برای ساخت یک Pattern، ابتدا باید یکی از متدهای Static عمومی compile() را فراخوانی کنید که یک شیء Pattern برمیگرداند. این متدها یک عبارت باقاعده را بهعنوان آرگومان اول میپذیرند. بخشهای بعدی نحو مورد نیاز را پوشش میدهند.
شیء Matcher موتوری است که الگو را تفسیر کرده و عملیات تطبیق را روی رشتهی ورودی اجرا میکند. مانند کلاس Pattern، کلاس Matcher نیز Constructor عمومی ندارد. شیء Matcher را با فراخوانی متد matcher() روی یک شیء Pattern دریافت میکنید.
شیء PatternSyntaxException یک Exception Unchecked است که خطای نحوی در الگوی عبارت باقاعده را نشان میدهد.
قبل از بررسی تکتک کلاسها، باید بفهمید عبارات باقاعده چگونه ساخته میشوند. یک Test Harness ساده معرفی میکنیم که برای بررسی نحو آنها مورد استفاده قرار میگیرد.
از انتشار JDK 7 به بعد، تطبیق الگوی عبارات باقاعده قابلیت پشتیبانی از یونیکد 6.0 را گسترش داده است.
میتوانید یک Code Point یونیکد مشخص را با استفاده از Escape Sequence به شکل \\uFFFF تطبیق دهید، که FFFF مقدار هگزادسیمال Code Point مورد نظر است. بهعنوان مثال \\u6771 کاراکتر هان شرق (east) را تطبیق میدهد.
همچنین میتوانید Code Point را با نماد هگز سبک Perl، یعنی \\x{...} مشخص کنید. بهعنوان مثال:
String hexPattern = "\\x{" + Integer.toHexString(codePoint) + "}";
هر کاراکتر یونیکد علاوه بر مقدارش، ویژگیهایی (Properties) نیز دارد. میتوانید یک کاراکتر متعلق به یک دستهی خاص را با عبارت \\p{prop} و یک کاراکتر غیر متعلق به آن دسته را با \\P{prop} تطبیق دهید.
سه نوع ویژگی پشتیبانیشده: Script ها، Block ها و دستهی «عمومی» هستند.
برای تعیین اینکه آیا یک Code Point به یک Script مشخص تعلق دارد، میتوانید از کلمهی کلیدی script یا شکل مختصر sc استفاده کنید، مانند \\p{script=Hiragana}. یا میتوانید پیشوند Is به نام Script اضافه کنید، مانند \\p{IsHiragana}.
نامهای معتبر Script که توسط Pattern پشتیبانی میشوند همانهایی هستند که توسط UnicodeScript.forName() پذیرفته میشوند.
یک Block را میتوان با کلمهی کلیدی block یا شکل مختصر blk مشخص کرد، مانند \\p{block=Mongolian}. یا میتوانید پیشوند In به نام Block اضافه کنید، مانند \\p{InMongolian}.
دستهها را میتوان با پیشوند اختیاری Is مشخص کرد. بهعنوان مثال IsL دستهی حروف یونیکد را تطبیق میدهد. همچنین میتوانید از کلمهی کلیدی general_category یا شکل مختصر gc استفاده کنید. بهعنوان مثال یک حرف بزرگ را میتوان با general_category=Lu یا gc=Lu تطبیق داد.
این بخش یک ابزار تست قابل استفادهی مجدد به نام RegexTestHarness.java برای بررسی ساختارهای عبارت باقاعدهی پشتیبانیشده توسط این API تعریف میکند. دستور اجرای این کد java RegexTestHarness است و هیچ آرگومان خط فرمانی قبول نمیکند. برنامه بهطور حلقهای تکرار میشود و از کاربر یک عبارت باقاعده و رشتهی ورودی میخواهد. استفاده از این ابزار اختیاری است اما برای بررسی مثالهای بخشهای بعدی مفید خواهد بود.
import java.io.Console;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class RegexTestHarness {
public static void main(String[] args){
Console console = System.console();
if (console == null) {
System.err.println("No console.");
System.exit(1);
}
while (true) {
Pattern pattern =
Pattern.compile(console.readLine("%nEnter your regex: "));
Matcher matcher =
pattern.matcher(console.readLine("Enter input string to search: "));
boolean found = false;
while (matcher.find()) {
console.format("I found the text" +
" \\\"%s\\\" starting at " +
"index %d and ending at index %d.%n",
matcher.group(),
matcher.start(),
matcher.end());
found = true;
}
if(!found){
console.format("No match found.%n");
}
}
}
}
قبل از ادامه، میتوانید این کد را ذخیره و کامپایل کنید تا مطمئن شوید محیط توسعهی شما از پکیجهای مورد نیاز پشتیبانی میکند.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://dev.java/learn/