دوره‌ها / JAVA / عبارات باقاعده/رگکس (Java RegEx)

عبارات باقاعده/رگکس (Java RegEx)

15 دقیقه Article

عبارات باقاعده (RegEx): جادویِ جستجو در متن 🔍✨

رگکس یا Regular Expressions یک زبانِ الگوسازی برای جستجو، ویرایش و اعتبارسنجیِ متن‌هاست. با رگکس می‌توانید به راحتی بفهمید آیا یک ایمیل یا شماره موبایل فرمتِ درستی دارد یا خیر.

۱. کلاس‌های اصلی (java.util.regex)

  • Pattern: برای تعریفِ الگو استفاده می‌شود.
  • Matcher: برای مقایسه‌یِ الگو با یک متنِ خاص استفاده می‌شود.
{code_block('Pattern pattern = Pattern.compile("w3schools", Pattern.CASE_INSENSITIVE);\nMatcher matcher = pattern.matcher("Visit W3Schools!");\nboolean matchFound = matcher.find();')}

۲. کاراکترهایِ جادویی (Metacharacters) 🎭

  • [abc]: یعنی یکی از حروفِ a یا b یا c.
  • [^abc]: یعنی هر کاراکتری به جز این حروف.
  • [0-9]: یعنی هر عددی.
  • |: یعنی این یا آن (Logical OR).

۳. تکرارکننده‌ها (Quantifiers)

  • +: یک یا چند بار تکرار.
  • *: صفر یا چند بار تکرار.
  • ?: صفر یا یک بار.
مثال کاربردی: الگویِ ^[a-zA-Z0-9+_.-]+@[a-zA-Z0-9.-]+$ یکی از ساده‌ترین مدل‌ها برایِ اعتبارسنجیِ ایمیل است.

چرا رگکس؟

بدون رگکس، برای پیدا کردنِ تمامِ شماره تلفن‌ها در یک متنِ طولانی، باید صدها خط کدِ پیچیده با if و charAt بنویسید. با رگکس، کلِ کار در یک خط انجام می‌شود.

نکته پرفورمنس: کامپایل کردنِ الگو (Pattern.compile) عملیاتِ سنگینی است. اگر یک رگکس ثابت دارید، آن را به صورت static final تعریف کنید تا فقط یک بار در کلِ عمرِ برنامه کامپایل شود.
<hr style="margin: 50px 0; border: 0; border-top: 1px dashed rgba(255,255,255,0.1);">

بخش تخصصی: مهندسی پیشرفته و امنیت سیستم 🛡️⚙️

در این بخش، به مفاهیمی می‌پردازیم که برای پایداری و امنیتِ برنامه‌های بزرگِ جاوا حیاتی هستند.

۱. استراتژی مدیریت استثناها (Fail-Fast vs Fail-Safe)

در طراحی سیستم‌های بزرگ، ما معمولاً از الگوی Fail-Fast استفاده می‌کنیم؛ یعنی به محض وقوع خطا، برنامه را با یک استثنای دقیق متوقف می‌کنیم تا از انتشار فساد داده‌ها جلوگیری کنیم. همچنین، نباید استثناها را با یک بلاکِ catch خالی "خفه" کنید. هر استثنا باید حتماً لاگ (Log) شود یا به لایه‌ی بالاتر گزارش داده شود.

۲. کالبدشکافی Autoboxing در حافظه

تبدیلِ اتوماتیکِ انواعِ Primitive به اشیاءِ Wrapper (مثل تبدیل int به Integer) در ظاهر ساده است، اما در حلقه‌هایِ سنگین می‌تواند باعثِ ایجادِ هزاران شیءِ اضافه در حافظه Heap و در نتیجه فشار به Garbage Collector شود. همیشه در بخش‌های حساس به پرفورمنس، از انواع Primitive استفاده کنید.

۳. پارادایم برنامه‌نویسی تابعی (Functional Programming)

استفاده از Lambda Expressions شروعِ حرکتِ جاوا به سمت برنامه‌نویسی تابعی بود. این سبک نه تنها باعثِ کوتاه‌تر شدنِ کدها می‌شود، بلکه امکانِ اجرایِ موازیِ کدها (Parallel processing) را روی پردازنده‌های چند هسته‌ای بسیار ساده‌تر می‌کند.

نکته پایانی: مهارت در مدیریتِ خطاها و استفاده از نخ‌ها (Threads)، مرزِ بین یک کدنِویسِ مبتدی و یک توسعه‌دهنده‌یِ ارشد است. همیشه کدی بنویسید که در مقابلِ بدترین ورودی‌ها هم مقاوم باشد.

تمرین‌های عملی

برای تثبیت یادگیری این درس تمرین‌های زیر را حل کنید

پیدا کردن شماره Medium
سوال تمرین

با استفاده از متد find() در کلاسِ Matcher، بررسی کنید آیا کلمه‌یِ "Java" در متنِ داده شده وجود دارد یا خیر. اگر بود، "Found" را چاپ کنید.

پاسخ تمرین
JAVA
import java.util.regex.*;

public class Main {
  public static void main(String[] args) {
    Pattern p = Pattern.compile("Java");
    Matcher m = p.matcher("Java is powerful");
    if (m.find()) {
      System.out.println("Found");
    }
  }
}

آماده رفتن به درس بعدی هستید؟

این درس را به پایان رساندید و می‌توانید به درس بعدی بروید.