مشخصات مقاله
-
1639
-
0.0
-
11653
-
0
-
0
آموزش 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 به صورت گسترده جهت تعریف الگوهای جستجو (تطبیق) و عبارات باقاعده استفاده می شوند.
- MatchResult interface
- Matcher class
- Pattern class
- PatternSyntaxException class
کلاس Matcher
کلاس Matcher اینترفیس MatchResult را پیاده سازی می کند. این کلاس یک موتور تطبیق عبارت باقاعده (regex engine) با رشته محسوب می شود که توسعه دهنده می تواند برای انجام عملیات انطباق بر روی دنباله ای از کاراکترها/char sequence از آن استفاده کند (جهت جستجو و دسترسی به عبارت مورد نظر در یک دنباله از کاراکترها).
کلاس Pattern
این کلاس نسخه ی کامپایل شده از عبارت باقاعده (compiled version) هست. از این کلاس برای تعریف الگویی جهت تطبیق با عبارت مورد جستجو و regex engine بکار می رود.
مثال کاربردی از عبارات باقاعده ی 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)
: [a-dm-p] (union)
((subtraction [ad-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 ها تعداد دفعاتی که یک کاراکتر در متن مورد نظر تکرار (یافت) می شود را مشخص می کند.
مثال کاربردی از 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 ها نقش کدهای کوتاه و مختصر را ایفا می کنند.
[^0-9] می باشد.
[a-zA-Z_0-9] می باشد.
word boundary با مکان های قرارگیری منطبق می شود که یک طرف word و طرف دیگر یک non word می باشد.
زمانی استفاده می شود که بخواهید تنها خود دنباله ی کاراکتری یا عددی را در متن پیدا کرده یا مطمئن شوید که کاراکترهای مورد نظر شما حتما در ابتدا یا انتهای دنباله ی کاراکتری قرار دارند.
با هر کاراکتر 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