کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

آموزش Java – کار با Regex یا عبارات باقاعده در Java

آموزش Java – کار با Regex یا عبارات باقاعده در Java

Java Regex یا عبارات باقاعده یک سری توابع کتابخانه ای/API در جاوا هستند که توسعه دهنده به کمک آن ها می تواند الگوهایی تعریف کرده و بر اساس آن عبارت مورد نظر را در رشته جستجو و پس از یافتن ،ویرایش (جایگزین) نماید. به طور کلی Regular expression عبارت است از تعدادی روش و قانون که برای بررسی وجود یک عبارت (دنباله ای از مقادیر متنی، عددی و ...)، استخراج و جایگزینی آن در بستر بکار می رود.

Regex به صورت گسترده جهت اعمال قید بر روی رشته ها جهت سنجش اعتبار آدرس ایمیل و درستی رمزعبور (email&password validation) بکار می رود. پس از یادگیری java regex می توانید عبارات باقاعده ای که خود تنظیم کرده اید را به وسیله ی ابزار Java Regex Tester Tool تست نمایید.

توابع کتابخانه ای Java Regex API یک interface و سه کلاس در پکیج java.util.regex دارد که توسعه دهنده با ارث بری کلاس ها و پیاده سازی interface آن می تواند از امکانات عبارات باقاعده استفاده کند.

پکیج java.util.regex

کامپوننت های موجود در این پکیج به شرح زیر می باشند. کلاس های Matcher و Pattern به صورت گسترده جهت تعریف الگوهای جستجو (تطبیق) و عبارات باقاعده استفاده می شوند.

  1. MatchResult interface
  2. Matcher class
  3. Pattern class
  4. PatternSyntaxException class

کلاس Matcher

کلاس Matcher اینترفیس MatchResult را پیاده سازی می کند. این کلاس یک موتور تطبیق عبارت باقاعده (regex engine) با رشته محسوب می شود که توسعه دهنده می تواند برای انجام عملیات انطباق بر روی دنباله ای از کاراکترها/char sequence از آن استفاده کند (جهت جستجو و دسترسی به عبارت مورد نظر در یک دنباله از کاراکترها).

No
متد
شرح
1
boolean matches()
بررسی می کند آیا رشته ی مورد نظر با الگو (pattern) تطباق دارد یا خیر.
2
boolean find()
عبارت بعدی که با الگوی مورد نظر همخوانی دارد را پیدا می کند.
3
boolean find(int start)
این متد بر اساس مقدار پارامتر ورودی (int start)/اندیس شروع عبارت بعدی که با الگوی مورد نظر منطبق هست را پیدا می کند.
4
String group()
بخش مورد نظر از دنباله ی کاراکتری (subsequence) که با الگو منطبق بوده را در خروجی برمی گرداند.
5
int start()
اندیس شروع بخش مورد نظر از دنباله ی کاراکتری (subsequence) که با الگو منطبق بوده را در خروجی برمی گرداند.
6
int end()
اندیس پایان بخش مورد نظر از دنباله ی کاراکتری (subsequence) که با الگو منطبق بوده را در خروجی برمی گرداند.
7
int groupCount()
تعداد کل subsequence های منطبق با الگوی مورد نظر را برمی گرداند.

کلاس Pattern

این کلاس نسخه ی کامپایل شده از عبارت باقاعده (compiled version) هست. از این کلاس برای تعریف الگویی جهت تطبیق با عبارت مورد جستجو و regex engine بکار می رود.

No
متد
شرح
1
static Pattern compile(String regex)
ابتدا الگو یا regex ارسال شده به عنوان پارامتر را کامپایل کرده و سپس نمونه ای از کلاس pattern را برمی گرداند.
2
Matcher matcher(CharSequence input)
یک آبجکت از Matcher ایجاد کرده که ورودی مورد نظر را با الگو (pattern) تطبیق می دهد.
3
static boolean matches(String regex, CharSequence input)
این متد عبارت باقاعده را کامپایل کرده و ورودی مورد نظر را با الگوی مشخص شده تطبیق می دهد.
4
String[] split(CharSequence input)
ورودی مورد نظر (دنباله ای از کاراکترها که قرار است تجزیه شود) را بر اساس موارد منطبق با الگو (pattern) تکه تکه می کند و در خروجی آرایه ای از رشته های ورودی که بر اساس موارد منطبق با الگو تجزیه شده اند را برمی گرداند.
5
String pattern()
الگوی عبارت باقاعده/regex pattern را برمی گرداند.

مثال کاربردی از عبارات باقاعده ی Java

سه روش برای فراخوانی و استفاده از امکان regular expression در جاوا وجود دارد:

import java.util.regex.*;  
public class RegexExample1{  
public static void main(String args[]){  
//1st way  
Pattern p = Pattern.compile(".s");//. represents single character  
Matcher m = p.matcher("as");  
boolean b = m.matches();  
//2nd way  
boolean b2=Pattern.compile(".s").matcher("as").matches();  
//3rd way  
boolean b3 = Pattern.matches(".s", "as");  
System.out.println(b+" "+b2+" "+b3);  
}}  

خروجی:

true true true

مثال کاربردی از کاراکتر نقطه "." در Regex

نقطه "." نشانگر یک تک کاراکتر بوده و با هر کاراکتری منطبق می شود.

import java.util.regex.*;  
class RegexExample2{  
public static void main(String args[]){  
System.out.println(Pattern.matches(".s", "as"));//true (2nd char is s)  
System.out.println(Pattern.matches(".s", "mk"));//false (2nd char is not s)  
System.out.println(Pattern.matches(".s", "mst"));//false (has more than 2 char)  
System.out.println(Pattern.matches(".s", "amms"));//false (has more than 2 char)  
System.out.println(Pattern.matches("..s", "mas"));//true (3rd char is s)  
}}  

مجموعه کاراکترهای معنی دار و مخصوص عبارات باقاعده که در الگوها استفاده می شود (Regex)

No
مجموعه کاراکترهای ویژه ی عبارات باقاعده (character class)
شرح
1
[abc]
با a، b یا c (کلاس ساده) همخوانی دارد.
2
[^abc]
با تمامی کاراکترها به جز a، b یا c منطبق است (negation یا نقیض).
3
[a-zA-Z]
از کاراکتر a گرفته تا z یا از A بزرگ تا Z بزرگ را شامل شده و با هر کاراکتری که بین این دو حرف باشد، منطبق می شود (inclusive range یا شامل شونده ی تمامی حروف بین بازه ی مزبور).
4
[a-d[m-p]]
با کاراکترهایی که بین دو حرف a تا d هستند یا بین بازه ی m تا p قرار دارند، مطابقت پیدا می کند
: [a-dm-p] (union)
5
[a-z&&[def]]
فقط با d، e یا f (intersection) مطابقت دارد.
6
[a-z&&[^bc]]
با تمامی حروفی که بین بازه ی a تا z قرار دارند، به استثنای دو حرف b و c ، منطبق می شود.
((subtraction [ad-z]
7
[a-z&&[^m-p]]
با تمامی حروف بین بازه ی a تا z به استثنای m،n، o و p منطبق می باشد: [a-lq-z]

مثال کاربردی از استفاده ی مجموعه کاراکترهای ویژه ی عبارات با قاعده (Regular Expression Character classes) در جستجو و دسترسی به متن مورد نظر

import java.util.regex.*;  
class RegexExample3{  
public static void main(String args[]){  
System.out.println(Pattern.matches("[amn]", "abcd"));//false (not a or m or n)  
System.out.println(Pattern.matches("[amn]", "a"));//true (among a or m or n)  
System.out.println(Pattern.matches("[amn]", "ammmna"));//false (m and a comes more than once)  
}}  

Regex Quantifier ها/الگوهای سنجش تعداد دفعات تکرار یک کاراکتر

quantifier ها تعداد دفعاتی که یک کاراکتر در متن مورد نظر تکرار (یافت) می شود را مشخص می کند.

No
الگو یا عبارت باقاعده/ Regex
شرح
1
X?
کاراکتر Xتنها یکبار تکرار می شود یا اصلا تکرار نمی شود.
2
X+
کاراکتر X حداقل یکبار یا دفعات بیشتری تکرار می شود.
3
X*
X می تواند تکرار نشود یا چندین بار در متن مورد نظر نمونه ی آن یافت شود.
4
X{n}
کاراکتر X فقط به تعداد معین شده تکرار می شود.
5
X{n,}
کاراکتر X به تعداد دفعات معین شده یا بیشتر در متن یا بستر مورد نظر تکرار می شود.
6
X{y,z}
کاراکتر X به تعداد دفعات y تکرار می شود اما حتما کمتر از مقدار z

مثال کاربردی از character class ها و quantifier ها در عبارات باقاعده

import java.util.regex.*;  
class RegexExample4{  
public static void main(String args[]){  
System.out.println("? quantifier ....");  
System.out.println(Pattern.matches("[amn]?", "a"));//true (a or m or n comes one time)  
System.out.println(Pattern.matches("[amn]?", "aaa"));//false (a comes more than one time)  
System.out.println(Pattern.matches("[amn]?", "aammmnn"));//false (a m and n comes more than one tim)  
System.out.println(Pattern.matches("[amn]?", "aazzta"));//false (a comes more than one time)  
System.out.println(Pattern.matches("[amn]?", "am"));//false (a or m or n must come one time)  
System.out.println("+ quantifier ....");  
System.out.println(Pattern.matches("[amn]+", "a"));//true (a or m or n once or more times)  
System.out.println(Pattern.matches("[amn]+", "aaa"));//true (a comes more than one time)  
System.out.println(Pattern.matches("[amn]+", "aammmnn"));//true (a or m or n comes more than once)  
System.out.println(Pattern.matches("[amn]+", "aazzta"));//false (z and t are not matching pattern)  
System.out.println("* quantifier ....");  
System.out.println(Pattern.matches("[amn]*", "ammmna"));//true (a or m or n may come zero or more times)  
}}  

Metacharacter های مورد استفاده در عبارات باقاعده (Regex)

metacharacter ها نقش کدهای کوتاه و مختصر را ایفا می کنند.

No
متاکاراکتر/الگو یا عبارت باقاعده
شرح
1
.
با هر کاراکتری منطبق می شود (ممکن است با نقطه ی انتهای رشته/terminator نیز منطبق باشد یا با آن مطابقت پیدا نکند.)
2
\d
با تمامی اعداد منطبق می باشد و در واقع ورژن مختصر الگوی [0-9] می باشد.
3
\D
با تمامی کاراکترهای غیر عددی منطبق می شود و در واقع ورژن مختصر
[^0-9] می باشد.
4
\s
با تمامی کاراکترهای فاصله (whitespace) منطبق می باشد و ورژن مختصر الگوی طولانی [\t\n\x0B\f\r] می باشد.
5
\S
با تمامی کاراکترها به غیر از فاصله (whitespace) منطبق شده و ورژن مختصر الگوی [^\s] می باشد.
6
\w
با تمامی کاراکترهای ASCII مطابقت خواهد داشت و ورژن مختصر الگوی
[a-zA-Z_0-9] می باشد.
7
\W
با تمامی کاراکترهای غیر ASCII یا non-word منطبق خواهد شد و در واقع نسخه ی مختصر الگوی [^\w] می باشد.
8
\b
word boundary
word boundary با مکان های قرارگیری منطبق می شود که یک طرف word و طرف دیگر یک non word می باشد.
زمانی استفاده می شود که بخواهید تنها خود دنباله ی کاراکتری یا عددی را در متن پیدا کرده یا مطمئن شوید که کاراکترهای مورد نظر شما حتما در ابتدا یا انتهای دنباله ی کاراکتری قرار دارند.
9
\B
یک non word boundary
با هر کاراکتر non word ای که در هر جایی از یک رشته قرار داشته باشد، منطبق می شود.

مثال کاربردی از استفاده ی metacharacter ها در عبارات باقاعده

import java.util.regex.*;  
class RegexExample5{  
public static void main(String args[]){  
System.out.println("metacharacters d....");\\d means digit  
System.out.println(Pattern.matches("\\d", "abc"));//false (non-digit)  
System.out.println(Pattern.matches("\\d", "1"));//true (digit and comes once)  
System.out.println(Pattern.matches("\\d", "4443"));//false (digit but comes more than once)  
System.out.println(Pattern.matches("\\d", "323abc"));//false (digit and char)  
System.out.println("metacharacters D....");\\D means non-digit    
System.out.println(Pattern.matches("\\D", "abc"));//false (non-digit but comes more than once)  
System.out.println(Pattern.matches("\\D", "1"));//false (digit)  
System.out.println(Pattern.matches("\\D", "4443"));//false (digit)  
System.out.println(Pattern.matches("\\D", "323abc"));//false (digit and char)  
System.out.println(Pattern.matches("\\D", "m"));//true (non-digit and comes once)  
System.out.println("metacharacters D with quantifier....");  
System.out.println(Pattern.matches("\\D*", "mak"));//true (non-digit and may come 0 or more times)  
}}  

مثال کلی 1 از عبارات باقاعده

/*Create a regular expression that accepts alpha numeric characters only. Its 
length must be 6 characters long only.*/   
import java.util.regex.*;  
class RegexExample6{  
public static void main(String args[]){  
System.out.println(Pattern.matches("[a-zA-Z0-9]{6}", "arun32"));//true  
System.out.println(Pattern.matches("[a-zA-Z0-9]{6}", "kkvarun32"));//false (more than 6 char)  
System.out.println(Pattern.matches("[a-zA-Z0-9]{6}", "JA2Uk2"));//true  
System.out.println(Pattern.matches("[a-zA-Z0-9]{6}", "arun$2"));//false ($ is not matched)  
}}  

مثال کلی 2 از عبارات باقاعده

/*Create a regular expression that accepts 10 digit numeric characters 
starting with 7, 8 or 9 only.*/  
import java.util.regex.*;  
class RegexExample7{  
public static void main(String args[]){  
System.out.println("by character classes and quantifiers ...");  
System.out.println(Pattern.matches("[789]{1}[0-9]{9}", "9953038949"));//true  
System.out.println(Pattern.matches("[789][0-9]{9}", "9953038949"));//true  
System.out.println(Pattern.matches("[789][0-9]{9}", "99530389490"));//false (11 characters)  
System.out.println(Pattern.matches("[789][0-9]{9}", "6953038949"));//false (starts from 6)  
System.out.println(Pattern.matches("[789][0-9]{9}", "8853038949"));//true  
System.out.println("by metacharacters ...");  
System.out.println(Pattern.matches("[789]{1}\\d{9}", "8853038949"));//true  
System.out.println(Pattern.matches("[789]{1}\\d{9}", "3853038949"));//false (starts from 3)  
}}  

پیاده سازی یک Regex finder

در زیر برنامه ای می نویسیم که عبارت باقاعده یا الگو را دریافت کرده و پس از کامپایل، الگوی مورد نظر را با عبارت وارد شده تطبیق می دهد و در صورت یافتن مورد منطبق پیغام مربوطه را چاپ می کند.

import java.util.regex.Pattern;  
import java.util.Scanner;  
import java.util.regex.Matcher;    
public class RegexExample8{    
public static void main(String[] args){    
Scanner sc=new Scanner(System.in);  
while (true) {    
System.out.println("Enter regex pattern:");  
Pattern pattern = Pattern.compile(sc.nextLine());    
System.out.println("Enter text:");  
Matcher matcher = pattern.matcher(sc.nextLine());    
boolean found = false;    
while (matcher.find()) {    
        System.out.println("I found the text "+matcher.group()+" starting at index "+    
        matcher.start()+" and ending at index "+matcher.end());    
        found = true;    
}
if(!found){    
        System.out.println("No match found.");    
}    
}    
}    
}    

خروجی:

Enter regex pattern: java
Enter text: this is java, do you know java
I found the text java starting at index 8 and ending at index 12
I found the text java starting at index 26 and ending at index 30
1396/07/26 11653 1639
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...