کلاس Pattern متد compile جایگزینی تعریف میکند که مجموعهای از Flag ها را میپذیرد و نحوهی تطبیق الگو را تحت تأثیر قرار میدهد. پارامتر flags یک Bit Mask است که میتواند شامل هر یک از فیلدهای Static عمومی زیر باشد:
Pattern.CANON_EQ معادلسازی کانونیک (Canonical Equivalence) را فعال میکند. وقتی این Flag مشخص شود، دو کاراکتر فقط در صورتی تطبیق داده میشوند که تجزیههای کانونیک کاملشان با هم مطابقت داشته باشد. بهعنوان مثال عبارت «a\\u030A» با رشتهی «\\u00E5» وقتی تطبیق میدهد که این Flag مشخص شده باشد. بهطور پیشفرض، معادلسازی کانونیک در نظر گرفته نمیشود. مشخص کردن این Flag ممکن است هزینهی عملکردی داشته باشد.Pattern.CASE_INSENSITIVE تطبیق Case-Insensitive را فعال میکند. بهطور پیشفرض، تطبیق Case-Insensitive فرض میکند فقط کاراکترهای مجموعهی کاراکتری US-ASCII در حال تطبیق هستند. تطبیق Case-Insensitive آگاه به یونیکد با مشخص کردن Flag UNICODE_CASE همراه با این Flag فعال میشود. تطبیق Case-Insensitive همچنین از طریق عبارت Embedded Flag (?i) قابل فعالسازی است. مشخص کردن این Flag ممکن است هزینهی عملکردی جزئی داشته باشد.Pattern.COMMENTS فاصلهها و کامنتها را در الگو مجاز میکند. در این حالت، فاصلهها نادیده گرفته شده و کامنتهایی که با # شروع میشوند تا انتهای خط نادیده گرفته میشوند. حالت Comments همچنین از طریق عبارت Embedded Flag (?x) قابل فعالسازی است.Pattern.DOTALL حالت Dotall را فعال میکند. در حالت Dotall، عبارت . هر کاراکتری از جمله Line Terminator را تطبیق میدهد. بهطور پیشفرض این عبارت Line Terminator ها را تطبیق نمیدهد. حالت Dotall همچنین از طریق عبارت Embedded Flag (?s) قابل فعالسازی است (حرف s مخفف حالت «single-line» است که نام آن در Perl است).Pattern.LITERAL پارس تحتاللفظی (Literal Parsing) الگو را فعال میکند. وقتی این Flag مشخص شود، رشتهی ورودی که الگو را مشخص میکند بهعنوان دنبالهای از کاراکترهای تحتاللفظی رفتار میشود. Metacharacter یا Escape Sequence در دنبالهی ورودی معنای خاصی نخواهد داشت. Flag های Pattern.CASE_INSENSITIVE و Pattern.UNICODE_CASE تأثیر خود روی تطبیق را هنگام استفاده همراه با این Flag حفظ میکنند. سایر Flag ها غیرضروری میشوند. هیچ کاراکتر Embedded Flag برای فعالسازی پارس تحتاللفظی وجود ندارد.Pattern.MULTILINE حالت چندخطی (Multiline) را فعال میکند. در حالت چندخطی، عبارات ^ و $ به ترتیب درست بعد از Line Terminator یا درست قبل از انتهای دنبالهی ورودی تطبیق میدهند. بهطور پیشفرض این عبارات فقط در ابتدا و انتهای کل دنبالهی ورودی تطبیق میدهند. حالت چندخطی همچنین از طریق عبارت Embedded Flag (?m) قابل فعالسازی است.Pattern.UNICODE_CASE Case Folding آگاه به یونیکد را فعال میکند. وقتی این Flag مشخص شود، تطبیق Case-Insensitive — که توسط Flag CASE_INSENSITIVE فعال شده — به شیوهای سازگار با استاندارد یونیکد انجام میشود. بهطور پیشفرض، تطبیق Case-Insensitive فرض میکند فقط کاراکترهای مجموعهی کاراکتری US-ASCII در حال تطبیق هستند. Case Folding آگاه به یونیکد همچنین از طریق عبارت Embedded Flag (?u) قابل فعالسازی است. مشخص کردن این Flag ممکن است هزینهی عملکردی داشته باشد.Pattern.UNIX_LINES حالت خطوط یونیکس را فعال میکند. در این حالت، فقط \\n بهعنوان Line Terminator در رفتار .، ^ و $ شناخته میشود. حالت خطوط یونیکس همچنین از طریق عبارت Embedded Flag (?d) قابل فعالسازی است.در مراحل زیر Test Harness یعنی RegexTestHarness.java را برای ساخت Pattern با تطبیق Case-Insensitive تغییر میدهیم.
ابتدا کد را برای فراخوانی نسخهی جایگزین compile تغییر دهید:
Pattern pattern =
Pattern.compile(
console.readLine("%nEnter your regex: "),
Pattern.CASE_INSENSITIVE);
سپس کامپایل و اجرا کنید تا نتایج زیر را ببینید:
Enter your regex: dog
Enter input string to search: DoGDOg
I found the text "DoG" starting at index 0 and ending at index 3.
I found the text "DOg" starting at index 3 and ending at index 6.
همانطور که میبینید، رشتهی تحتاللفظی «dog» هر دو مورد را بدون توجه به Case تطبیق میدهد. برای کامپایل Pattern با چند Flag، Flag ها را با عملگر Bitwise OR یعنی | جدا کنید. برای خوانایی بیشتر، نمونههای کد زیر عبارت باقاعده را بهجای خواندن از کنسول Hardcode میکنند:
pattern = Pattern.compile("[az]$", Pattern.MULTILINE | Pattern.UNIX_LINES);
همچنین میتوانید بهجای آن یک متغیر int مشخص کنید:
int flags = Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE;
Pattern pattern = Pattern.compile("aa", flags);
همچنین میتوانید Flag های مختلف را با استفاده از عبارات Embedded Flag فعال کنید. عبارات Embedded Flag جایگزینی برای نسخهی دوپارامتری compile هستند و در خود عبارت باقاعده مشخص میشوند. مثال زیر از Test Harness اصلی RegexTestHarness.java با عبارت Embedded Flag (?i) برای فعالسازی تطبیق Case-Insensitive استفاده میکند.
Enter your regex: (?i)foo
Enter input string to search: FOOfooFoOfoO
I found the text "FOO" starting at index 0 and ending at index 3.
I found the text "foo" starting at index 3 and ending at index 6.
I found the text "FoO" starting at index 6 and ending at index 9.
I found the text "foO" starting at index 9 and ending at index 12.
بار دیگر، تمام تطبیقها بدون توجه به Case موفقیتآمیز هستند.
عبارات Embedded Flag متناظر با فیلدهای عمومی Pattern در جدول زیر آمده است:
| ثابت | عبارت Embedded Flag معادل |
|---|---|
Pattern.CANON_EQ | هیچکدام |
Pattern.CASE_INSENSITIVE | (?i) |
Pattern.COMMENTS | (?x) |
Pattern.MULTILINE | (?m) |
Pattern.DOTALL | (?s) |
Pattern.LITERAL | هیچکدام |
Pattern.UNICODE_CASE | (?u) |
Pattern.UNIX_LINES | (?d) |
کلاس Pattern متد matches مفیدی تعریف میکند که به شما امکان بررسی سریع وجود یک الگو در رشتهی ورودی دادهشده را میدهد. مانند تمام متدهای Static عمومی، باید آن را با نام کلاس فراخوانی کنید، مانند Pattern.matches("\\d","1");. در این مثال متد true برمیگرداند چون رقم «1» با عبارت باقاعده \\d تطبیق میدهد.
متد split() ابزاری عالی برای جمعآوری متن در دو طرف الگوی تطبیقیافته است. همانطور که در ادامه نشان داده شده، متد split() میتواند کلمات «one two three four five» را از رشتهی «one:two:three:four:five» استخراج کند:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class SplitDemo {
private static final String REGEX = ":";
private static final String INPUT =
"one:two:three:four:five";
public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
String[] items = p.split(INPUT);
for(String s : items) {
IO.println(s);
}
}
}
خروجی اجرای این کد:
one
two
three
four
five
برای سادگی، یک رشتهی تحتاللفظی یعنی دونقطه (:) بهجای عبارت باقاعدهی پیچیده تطبیق داده شد. چون همچنان از اشیاء Pattern و Matcher استفاده میکنیم، میتوانید از split() برای استخراج متن در دو طرف هر عبارت باقاعدهای استفاده کنید. همین مثال با تغییر به تطبیق روی اعداد در ادامه آمده است:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class SplitDemo2 {
private static final String REGEX = "\\d";
private static final String INPUT =
"one9two4three7four1five";
public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
String[] items = p.split(INPUT);
for(String s : items) {
IO.println(s);
}
}
}
خروجی اجرای این کد مشابه است:
one
two
three
four
five
متدهای زیر نیز میتوانند مفید باشند:
public static String quote(String s) یک رشتهی الگوی تحتاللفظی برای String مشخصشده برمیگرداند. این رشته میتواند برای ساخت Patternای استفاده شود که String s را همانند یک الگوی تحتاللفظی تطبیق دهد. Metacharacter یا Escape Sequence در دنبالهی ورودی معنای خاصی نخواهد داشت.public String toString() نمایش رشتهای این Pattern را برمیگرداند. این همان عبارت باقاعدهای است که Pattern از آن کامپایل شده است.پشتیبانی عبارات باقاعده در java.lang.String نیز از طریق چندین متد که رفتار java.util.regex.Pattern را تقلید میکنند وجود دارد. برای راحتی، بخشهای کلیدی API آنها در ادامه آمده است.
public boolean matches(String regex) مشخص میکند آیا این رشته با عبارت باقاعدهی مشخصشده تطبیق دارد یا خیر. فراخوانی str.matches(regex) دقیقاً نتیجهی Pattern.matches(regex, str) را تولید میکند.public String[] split(String regex, int limit) این رشته را بر اساس تطبیقهای عبارت باقاعدهی مشخصشده تقسیم میکند. فراخوانی str.split(regex, n) دقیقاً نتیجهی Pattern.compile(regex).split(str, n) را تولید میکند.public String[] split(String regex) این رشته را بر اساس تطبیقهای عبارت باقاعده تقسیم میکند. این متد دقیقاً مانند فراخوانی متد split دوپارامتری با آرگومان limit برابر صفر است. رشتههای خالی انتهایی در آرایهی نتیجه قرار نمیگیرند.همچنین متد replace() وجود دارد که یک CharSequence را با دیگری جایگزین میکند:
public String replace(CharSequence target, CharSequence replacement) هر زیررشتهای که با دنبالهی تحتاللفظی هدف تطبیق دارد را با دنبالهی جایگزین مشخصشده عوض میکند. جایگزینی از ابتدای رشته تا انتها ادامه دارد. بهعنوان مثال جایگزینی «aa» با «b» در رشتهی «aaa» نتیجهی «ba» تولید میکند نه «ab».این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://dev.java/learn/