روش های کار با گروه های اسیر شده
کد منبع برنامهRegexDemo
شامل یک فراخوانی متد است m.group()
. متد group()
یکی از چندین روش کلاس است Matcher
که با هدف کار با گروههای دستگیر شده انجام میشود:
-
این روش
int groupCount()
تعداد گروه های گرفته شده را در الگوی تفکیک کننده برمی گرداند. این عدد گروه ضبط ویژه شماره 0 را که با الگوی کلی مطابقت دارد، در نظر نمی گیرد. -
این روش
String group()
کاراکترهای مطابق قبلی پیدا شده را برمی گرداند. برای گزارش یک جستجوی موفقیت آمیز برای یک رشته خالی، این روش یک رشته خالی را برمی گرداند. اگر حلکننده هنوز جستجویی را انجام نداده باشد یا عملیات جستجوی قبلی ناموفق باشد، یک استثنا ایجاد میشودIllegalStateException
. -
این روش
String group(int group)
مشابه روش قبلی است، با این تفاوت که کاراکترهای تطابق قبلی پیدا شده را که توسط شماره گروه مشخص شده توسط پارامتر گرفته شده است، برمی گرداندgroup
. توجه داشته باشید که اینgroup(0)
معادل استgroup()
. اگر الگو یک گروه ضبط شده با عدد داده شده نداشته باشد، متد یک استثنا ایجاد می کندIndexOutOfBoundsException
. اگر حلکننده هنوز جستجویی را انجام نداده باشد یا عملیات جستجوی قبلی ناموفق باشد، یک استثنا ایجاد میشودIllegalStateException
. -
این روش
String group(String name)
کاراکترهای تطابق قبلی پیدا شده را که توسط گروه نام گرفته شده است، برمی گرداند. اگر نام گروه ضبط شده در الگو نباشد، یک استثنا ایجاد می شودIllegalArgumentException
. اگر حلکننده هنوز جستجویی را انجام نداده باشد یا عملیات جستجوی قبلی ناموفق باشد، یک استثنا ایجاد میشودIllegalStateException
.
groupCount()
و را نشان می دهد group(int group)
:
Pattern p = Pattern.compile("(.(.(.)))");
Matcher m = p.matcher("abc");
m.find();
System.out.println(m.groupCount());
for (int i = 0; i <= m.groupCount(); i++)
System.out.println(i + ": " + m.group(i));
نتایج اجرا:
3
0: abc
1: abc
2: bc
3: c
روش های تعیین موقعیت های مسابقه
کلاسMatcher
چندین روش ارائه می دهد که موقعیت های شروع و پایان یک مسابقه را برمی گرداند:
-
این روش
int start()
موقعیت شروع مسابقه قبلی پیدا شده را برمی گرداند. اگر حلکننده هنوز جستجویی را انجام نداده باشد یا عملیات جستجوی قبلی ناموفق باشد، یک استثنا ایجاد میشودIllegalStateException
. -
این روش
int start(int group)
مشابه روش قبلی است، اما موقعیت شروع مسابقه قبلی پیدا شده را برای گروهی که تعداد آنها توسط پارامتر مشخص شده است، برمیگرداندgroup
. اگر الگو یک گروه ضبط شده با عدد داده شده نداشته باشد، متد یک استثنا ایجاد می کندIndexOutOfBoundsException
. اگر حلکننده هنوز جستجویی را انجام نداده باشد یا عملیات جستجوی قبلی ناموفق باشد، یک استثنا ایجاد میشودIllegalStateException
. -
این روش
int start(String name)
مشابه روش قبلی است، اما موقعیت شروع مسابقه قبلی پیدا شده برای گروهی که نامیده می شود را برمی گرداندname
. اگر گروه ضبط شدهname
در الگو نباشد، یک استثنا ایجاد می شودIllegalArgumentException
. اگر حلکننده هنوز جستجویی را انجام نداده باشد یا عملیات جستجوی قبلی ناموفق باشد، یک استثنا ایجاد میشودIllegalStateException
. -
این روش
int end()
موقعیت آخرین کاراکتر تطابق قبلی را به اضافه 1 برمی گرداند. اگر تطبیق دهنده هنوز تطابقی را انجام نداده باشد یا عملیات جستجوی قبلی ناموفق باشد، یک استثنا ایجاد می شودIllegalStateException
. -
این روش
int end(int group)
مشابه روش قبلی است، اما موقعیت پایانی مطابق قبلی پیدا شده را برای گروهی که تعداد آنها توسط پارامتر مشخص شده است، برمیگرداندgroup
. اگر الگو یک گروه ضبط شده با عدد داده شده نداشته باشد، متد یک استثنا ایجاد می کندIndexOutOfBoundsException
. اگر حلکننده هنوز جستجویی را انجام نداده باشد یا عملیات جستجوی قبلی ناموفق باشد، یک استثنا ایجاد میشودIllegalStateException
. -
این روش
int end(String name)
مشابه روش قبلی است، اما موقعیت پایانی مسابقه قبلی پیدا شده برای گروهی به نام را برمیگرداندname
. اگر گروه ضبط شدهname
در الگو نباشد، یک استثنا ایجاد می شودIllegalArgumentException
. اگر حلکننده هنوز جستجویی را انجام نداده باشد یا عملیات جستجوی قبلی ناموفق باشد، یک استثنا ایجاد میشودIllegalStateException
.
Pattern p = Pattern.compile("(.(.(.)))");
Matcher m = p.matcher("abcabcabc");
while (m.find())
{
System.out.println("Найдено " + m.group(2));
System.out.println(" начинается с позиции " + m.start(2) +
" и заканчивается на позиции " + (m.end(2) - 1));
System.out.println();
}
خروجی این مثال به صورت زیر است:
Найдено bc
начинается с позиции 1 и заканчивается на позиции 2
Найдено bc
начинается с позиции 4 и заканчивается на позиции 5
Найдено bc
начинается с позиции 7 и заканчивается на позиции 8
روش های کلاس PatternSyntaxException
نمونه ای از کلاسPatternSyntaxException
یک خطای نحوی را در عبارت منظم توصیف می کند. چنین استثنایی را از متدها compile()
و matches()
کلاس پرتاب می کند Pattern
و از طریق سازنده زیر تشکیل می شود: PatternSyntaxException(String desc, String regex, int index)
این سازنده توضیحات مشخص شده ( desc
)، عبارت منظم ( regex
) و موقعیتی که در آن خطای نحو رخ داده است را ذخیره می کند. اگر محل خطای نحو ناشناخته باشد، مقدار index
را روی -1
. به احتمال زیاد، هرگز نیازی به ایجاد نمونه هایی از PatternSyntaxException
. با این حال، هنگام ایجاد یک پیام خطای فرمت شده، باید مقادیر بالا را استخراج کنید. برای این کار می توانید از روش های زیر استفاده کنید:
- متد
String getDescription()
شرحی از خطای نحوی را برمی گرداند. - این روش
int getIndex()
یا موقعیتی را که خطا در آن رخ داده است برمیگرداند، یا اگر موقعیت ناشناخته باشد -1 را برمیگرداند. - متد
String getPattern()
یک عبارت منظم نامعتبر را برمی گرداند.
String getMessage()
یک رشته چند خطی را با مقادیر برگردانده شده از روش های قبلی همراه با یک نشانه بصری از محل وقوع خطای نحوی در قالب برمی گرداند. خطای نحوی چیست؟ در اینجا یک مثال آورده شده است: java RegexDemo (?itree Treehouse
در این مورد، ما فراموش کردیم که متاکاراکتر پرانتز بسته ( )
) را در عبارت پرچم تو در تو مشخص کنیم. این چیزی است که از این خطا خروجی می شود:
regex = (?itree
input = Treehouse
Неправильное регулярное выражение: Unknown inline modifier near index 3
(?itree
^
Описание: Unknown inline modifier
Позиция: 3
Неправильный шаблон: (?itree
با استفاده از Regex API برنامه های کاربردی بیان منظم بسازید
عبارات منظم شما را قادر می سازد تا برنامه های قدرتمند پردازش متن ایجاد کنید. در این بخش، دو برنامه کاربردی را به شما نشان خواهیم داد که امیدواریم شما را تشویق کنند تا کلاسها و روشهای Regex API را بیشتر بررسی کنید. ضمیمه دوم Lexan را معرفی می کند: یک کتابخانه کد قابل استفاده مجدد برای انجام تحلیل واژگانی.عبارات و مستندات منظم
مستندسازی یکی از وظایف اجباری در هنگام توسعه نرم افزارهای حرفه ای است. خوشبختانه، عبارات منظم می توانند در بسیاری از جنبه های ایجاد مستندات به شما کمک کنند. کد موجود در Listing 1 خطوط حاوی نظرات به سبک C تک خطی و چند خطی را از یک فایل منبع استخراج کرده و در فایل دیگری می نویسد. برای اینکه کد کار کند، نظرات باید در همان خط باشند. فهرست 1. بازیابی نظراتimport java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
public class ExtCmnt
{
public static void main(String[] args)
{
if (args.length != 2)
{
System.err.println("Способ применения: java ExtCmnt infile outfile");
return;
}
Pattern p;
try
{
// Следующий шаблон определяет многострочные комментарии,
// располагающиеся в одной строке (например, /* одна строка */)
// и однострочные комментарии (например, // Howая-то строка).
// Комментарий может располагаться в любом месте строки.
p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
}
catch (PatternSyntaxException pse)
{
System.err.printf("Синтаксическая ошибка в регулярном выражении: %s%n", pse.getMessage());
System.err.printf("Описание ошибки: %s%n", pse.getDescription());
System.err.printf("Позиция ошибки: %s%n", pse.getIndex());
System.err.printf("Ошибочный шаблон: %s%n", pse.getPattern());
return;
}
try (FileReader fr = new FileReader(args[0]);
BufferedReader br = new BufferedReader(fr);
FileWriter fw = new FileWriter(args[1]);
BufferedWriter bw = new BufferedWriter(fw))
{
Matcher m = p.matcher("");
String line;
while ((line = br.readLine()) != null)
{
m.reset(line);
if (m.matches()) /* Должна соответствовать вся строка */
{
bw.write(line);
bw.newLine();
}
}
}
catch (IOException ioe)
{
System.err.println(ioe.getMessage());
return;
}
}
}
متد موجود main()
در لیست 1 ابتدا نحو صحیح خط فرمان را بررسی می کند و سپس یک عبارت منظم طراحی شده برای تشخیص کامنت های تک خطی و چند خطی در یک شی کلاس کامپایل می کند Pattern
. اگر هیچ استثنایی مطرح نشود PatternSyntaxException
، روش main()
فایل منبع را باز میکند، فایل مورد نظر را ایجاد میکند، یک تطبیق برای مطابقت با هر خط خوانده شده با الگو به دست میآورد، و سپس فایل منبع را خط به خط میخواند. برای هر خط، با یک الگوی نظر مطابقت داده می شود. در صورت موفقیت آمیز بودن، این روش main()
رشته را (به دنبال آن یک خط جدید) در فایل هدف می نویسد (منطق فایل ورودی/خروجی را در آموزش آتی جاوا 101 پوشش خواهیم داد). فهرست 1 را به صورت زیر کامپایل کنید: javac ExtCmnt.java
برنامه را با فایل ExtCmnt.java
به عنوان ورودی اجرا کنید: java ExtCmnt ExtCmnt.java out
باید نتایج زیر را در فایل خارج کنید:
// Следующий шаблон определяет многострочные комментарии,
// располагающиеся в одной строке (например, /* одна строка */)
// и однострочные комментарии (например, // Howая-то строка).
// Комментарий может располагаться в любом месте строки.
p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
if (m.matches()) /* Должна соответствовать вся строка */
در رشته الگو .*/\\*.*\\*/|.*//.*$
، متاکاراکتر لوله |
به عنوان یک عملگر OR منطقی عمل می کند، که نشان می دهد تطبیق دهنده باید از عملوند سمت چپ ساختار عبارت منظم داده شده برای یافتن یک تطابق در متن تطبیق استفاده کند. اگر هیچ منطبقی وجود نداشته باشد، تطبیق دهنده از عملوند سمت راست از ساختار عبارت منظم داده شده برای تلاش دیگری برای جستجو استفاده می کند (متاکاراکترهای پرانتز در گروه ضبط شده نیز یک عملگر منطقی را تشکیل می دهند). عبارات منظم در جاوا، قسمت 5
GO TO FULL VERSION