متدهای Index مقادیر ایندکس مفیدی ارائه میدهند که دقیقاً نشان میدهند تطبیق در کجای رشتهی ورودی پیدا شده است:
public int start(): ایندکس شروع تطبیق قبلی را برمیگرداند.public int start(int group): ایندکس شروع زیردنبالهی Capturingشده توسط گروه مشخصشده در تطبیق قبلی را برمیگرداند.public int end(): Offset بعد از آخرین کاراکتر تطبیقیافته را برمیگرداند.public int end(int group): Offset بعد از آخرین کاراکتر زیردنبالهی Capturingشده توسط گروه مشخصشده در تطبیق قبلی را برمیگرداند.متدهای Study رشتهی ورودی را بررسی کرده و مقدار Boolean برمیگردانند که نشان میدهد الگو پیدا شده یا خیر.
public boolean lookingAt(): تلاش میکند دنبالهی ورودی، شروع شده از ابتدای Region، را با الگو تطبیق دهد.public boolean find(): تلاش میکند زیردنبالهی بعدی دنبالهی ورودی که با الگو تطبیق دارد را پیدا کند.public boolean find(int start): این Matcher را ریست کرده و سپس تلاش میکند زیردنبالهی بعدی دنبالهی ورودی که با الگو تطبیق دارد را از ایندکس مشخصشده پیدا کند.public boolean matches(): تلاش میکند کل Region را با الگو تطبیق دهد.متدهای Replacement برای جایگزینی متن در رشتهی ورودی مفید هستند.
public Matcher appendReplacement(StringBuffer sb, String replacement) مرحلهی Non-Terminal Append-and-Replace را پیادهسازی میکند.public StringBuilder appendTail(StringBuilder sb) مرحلهی Terminal Append-and-Replace را پیادهسازی میکند.public String replaceAll(String replacement) هر زیردنبالهی دنبالهی ورودی که با الگو تطبیق دارد را با رشتهی جایگزین مشخصشده عوض میکند.public String replaceFirst(String replacement) اولین زیردنبالهی دنبالهی ورودی که با الگو تطبیق دارد را با رشتهی جایگزین مشخصشده عوض میکند.public static String quoteReplacement(String s) رشتهی جایگزین تحتاللفظی برای رشتهی مشخصشده برمیگرداند. کاراکترهای Slash و Dollar معنای خاصی نخواهند داشت.مثالی که تعداد دفعات ظاهر شدن کلمه «dog» در رشتهی ورودی را میشمارد:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class MatcherDemo {
private static final String REGEX =
"\\bdog\\b";
private static final String INPUT =
"dog dog dog doggie dogg";
public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
// دریافت شیء Matcher
Matcher m = p.matcher(INPUT);
int count = 0;
while(m.find()) {
count++;
IO.println("Match number "
+ count);
IO.println("start(): "
+ m.start());
IO.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
میبینید که این مثال از Boundary Matcher ها استفاده میکند تا مطمئن شود حروف «d» «o» «g» فقط زیررشتهای در یک کلمهی طولانیتر نیستند. همچنین اطلاعات مفیدی دربارهی محل تطبیق در رشتهی ورودی ارائه میدهد. متد start() ایندکس شروع و end() ایندکس آخرین کاراکتر تطبیقیافته به اضافهی یک را برمیگرداند.
متدهای matches() و lookingAt() هر دو تلاش میکنند دنبالهی ورودی را با الگو تطبیق دهند. تفاوت این است که matches() نیاز به تطبیق کل دنبالهی ورودی دارد، در حالی که lookingAt() چنین نیست. هر دو متد همیشه از ابتدای رشتهی ورودی شروع میکنند.
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class MatchesLooking {
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);
IO.println("Current REGEX is: "
+ REGEX);
IO.println("Current INPUT is: "
+ INPUT);
IO.println("lookingAt(): "
+ matcher.lookingAt());
IO.println("matches(): "
+ matcher.matches());
}
}
خروجی اجرای این کد:
Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
lookingAt(): true
matches(): false
متدهای replaceFirst() و replaceAll() متنی را که با عبارت باقاعدهی مشخصشده تطبیق دارد جایگزین میکنند. همانطور که از نامشان پیداست، replaceFirst() اولین وقوع و replaceAll() تمام وقوعها را جایگزین میکند.
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class ReplaceDemo {
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);
// دریافت شیء Matcher
Matcher m = p.matcher(INPUT);
INPUT = m.replaceAll(REPLACE);
IO.println(INPUT);
}
}
خروجی اجرای این کد:
The cat says meow. All cats say meow.
در این نسخه، تمام وقوعهای dog با cat جایگزین شدهاند. اما چرا متوقف شویم؟ بهجای جایگزینی یک رشتهی تحتاللفظی ساده مانند dog، میتوانید متنی را که با هر عبارت باقاعدهای تطبیق دارد جایگزین کنید.
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class ReplaceDemo2 {
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);
// دریافت شیء Matcher
Matcher m = p.matcher(INPUT);
INPUT = m.replaceAll(REPLACE);
IO.println(INPUT);
}
}
خروجی اجرای این کد:
-foo-foo-foo-
برای جایگزینی فقط اولین وقوع الگو، بهجای replaceAll() از replaceFirst() استفاده کنید. همان پارامتر را میپذیرد.
کلاس Matcher همچنین متدهای appendReplacement() و appendTail() را برای جایگزینی متن ارائه میدهد. مثال زیر از این دو متد برای ایجاد همان نتیجهی replaceAll() استفاده میکند.
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class RegexDemo {
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);
Matcher m = p.matcher(INPUT); // دریافت شیء Matcher
StringBuffer sb = new StringBuffer();
while(m.find()){
m.appendReplacement(sb,REPLACE);
}
m.appendTail(sb);
IO.println(sb.toString());
}
}
خروجی این کد مشابه مثال قبلی است.
-foo-foo-foo-
برای راحتی، کلاس String نیز چند متد Matcher را تقلید میکند:
public String replaceFirst(String regex, String replacement) اولین زیررشتهای از این رشته که با عبارت باقاعدهی مشخصشده تطبیق دارد را با جایگزین مشخصشده عوض میکند. فراخوانی string.replaceFirst(regex, repl) دقیقاً نتیجهی Pattern.compile(regex).matcher(str).replaceFirst(repl) را تولید میکند.public String replaceAll(String regex, String replacement) هر زیررشتهای از این رشته که با عبارت باقاعدهی مشخصشده تطبیق دارد را با جایگزین مشخصشده عوض میکند. فراخوانی string.replaceAll(regex, repl) دقیقاً نتیجهی Pattern.compile(regex).matcher(str).replaceAll(repl) را تولید میکند.این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://dev.java/learn/