MySQL রেগুলার এক্সপ্রেশন (REGEXP) গাইড: সিনট্যাক্স, MySQL 8 ফাংশন, উদাহরণ এবং সেরা অনুশীলন

目次

১. ভূমিকা

MySQL‑এ রেগুলার এক্সপ্রেশন ব্যবহার করা

MySQL একটি শক্তিশালী ডেটাবেস ম্যানেজমেন্ট সিস্টেম যা ডেটা অনুসন্ধান ও ম্যানিপুলেশনের জন্য ব্যবহৃত হয়, এবং এটি রেগুলার এক্সপ্রেশন (REGEXP) সমর্থন করে যাতে আরও নমনীয় অনুসন্ধান সম্ভব হয়। রেগুলার এক্সপ্রেশন ব্যবহার করে আপনি নির্দিষ্ট প্যাটার্নের সাথে মিলে এমন ডেটা দক্ষতার সঙ্গে বের করতে পারেন, পাশাপাশি ডেটা ফরম্যাট বা ভ্যালিডেট করতে পারেন।

MySQL‑এ রেগুলার এক্সপ্রেশন ব্যবহারের সুবিধা

MySQL রেগুলার এক্সপ্রেশন ব্যবহার করলে নিম্নলিখিত সুবিধা পাওয়া যায়:

  • উন্নত অনুসন্ধান : নির্দিষ্ট স্ট্রিং বা প্যাটার্ন ধারণকারী ডেটা সহজে বের করা যায়।
  • ডেটা অখণ্ডতা যাচাই : ইনপুট ভ্যালিডেশন (যেমন, ইমেইল ঠিকানার ফরম্যাট যাচাই) এর জন্য উপযোগী।
  • LIKE অপারেটরের চেয়ে বেশি শক্তিশালী : LIKE ব্যবহার করে ওয়াইল্ডকার্ড (% এবং _) ব্যবহার করা হয়, আর REGEXP আপনাকে আরও জটিল অনুসন্ধান শর্ত সংজ্ঞায়িত করতে দেয়।

এই প্রবন্ধের উদ্দেশ্য ও গঠন

এই প্রবন্ধে MySQL‑এ রেগুলার এক্সপ্রেশনের মৌলিক ধারণা থেকে উন্নত ব্যবহার, পারফরম্যান্স অপ্টিমাইজেশন, এবং MySQL 8.0 ও তার পরের সংস্করণে যোগ করা নতুন রেগুলার এক্সপ্রেশন ফাংশনগুলো পর্যন্ত সবকিছু ব্যাখ্যা করা হয়েছে। ব্যবহারিক উদাহরণসহ, বিষয়বস্তুটি নবীনদের জন্যও সহজে বোধগম্য করার জন্য ডিজাইন করা হয়েছে।

প্রবন্ধের গঠনঃ

  1. MySQL রেগুলার এক্সপ্রেশন মৌলিক বিষয় ও সিনট্যাক্স
  2. MySQL 8.0 ও পরের সংস্করণে যোগ করা রেগুলার এক্সপ্রেশন ফাংশন
  3. ব্যবহারিক উদাহরণ (ভ্যালিডেশন, ডেটা এক্সট্র্যাকশন, ফরম্যাট রূপান্তর)
  4. রেগুলার এক্সপ্রেশন ব্যবহার করার সময় গুরুত্বপূর্ণ বিষয় (পারফরম্যান্স, সিকিউরিটি)
  5. FAQ (প্রায়শই জিজ্ঞাসিত প্রশ্ন)
  6. সারসংক্ষেপ

২. MySQL‑এ রেগুলার এক্সপ্রেশন মৌলিক বিষয় ও সিনট্যাক্স

MySQL‑এ রেগুলার এক্সপ্রেশন কীভাবে ব্যবহার করবেন

MySQL‑এ আপনি REGEXP অপারেটর (বা RLIKE) ব্যবহার করে রেগুলার এক্সপ্রেশন নিয়ে কাজ করতে পারেন। LIKE অপারেটরের মতোই, এটি নির্ধারণ করতে ব্যবহৃত হয় যে কোনো কলামের মান নির্দিষ্ট রেজেক্স প্যাটার্নের সাথে মেলে কিনা।

মৌলিক সিনট্যাক্স

SELECT * FROM table_name WHERE column_name REGEXP 'regex_pattern';

অথবা

SELECT * FROM table_name WHERE column_name RLIKE 'regex_pattern';

RLIKE হল REGEXP‑এর একটি উপনাম, এবং দুটোই একইভাবে কাজ করে।

উদাহরণ
উদাহরণস্বরূপ, নামের মধ্যে “山” অক্ষরটি রয়েছে এমন রেকর্ড অনুসন্ধান করতে:

SELECT * FROM users WHERE name REGEXP '山';

মৌলিক রেগুলার এক্সপ্রেশন প্যাটার্ন

MySQL রেগুলার এক্সপ্রেশনে আপনি নিম্নলিখিত প্যাটার্নগুলো ব্যবহার করতে পারেন।

SymbolMeaningExampleResult
.Any single charactera.cMatches “abc”, “aac”, “adc”
^Start of the string^abcMatches “abcde” but not “dabc”
$End of the stringxyz$Matches “axyz” but not “xyzb”
[]Any one of the specified characters[abc]Matches “a”, “b”, or “c”
[^]Any character not in the specified set[^abc]Matches any character except “a”, “b”, or “c”
*Repeat the preceding character 0 or more timesa*Matches “”, “a”, “aa”, “aaa”, etc.
+Repeat the preceding character 1 or more timesa+Matches “a”, “aa”, “aaa”, etc. (does not match the empty string)
{n}Repeat the preceding character exactly n timesa{3}Matches “aaa”
{n,}Repeat the preceding character at least n timesa{2,}Matches “aa”, “aaa”, “aaaa”, etc.
{n,m}Repeat the preceding character between n and m timesa{2,4}Matches “aa”, “aaa”, “aaaa”

LIKE অপারেটর থেকে পার্থক্য

MySQL এছাড়াও LIKE অপারেটর প্রদান করে, যা সাধারণত সহজ প্যাটার্ন ম্যাচিংয়ের জন্য ব্যবহৃত হয়। তবে, REGEXP LIKE‑এর চেয়ে বেশি শক্তিশালী এবং আরও জটিল শর্তের সঙ্গে অনুসন্ধান সমর্থন করে।

উদাহরণ ১: LIKE অপারেটর ব্যবহার করা

SELECT * FROM users WHERE name LIKE '%山%';
  • LIKE ব্যবহার করে আপনি ধারণকারী ডেটা অনুসন্ধান করতে পারেন, তবে কেবল সহজ ওয়াইল্ডকার্ড (% এবং _) ব্যবহার করা যায়।

উদাহরণ ২: REGEXP অপারেটর ব্যবহার করা

SELECT * FROM users WHERE name REGEXP '^山';
  • REGEXP ব্যবহার করে আপনি শুধুমাত্র সেই ডেটা বের করতে পারেন যেখানে নাম 山 দিয়ে শুরু হয়

একাধিক প্যাটার্ন কীভাবে নির্দিষ্ট করবেন

আপনি | ব্যবহার করে OR শর্তের মাধ্যমে একাধিক প্যাটার্ন নির্দিষ্ট করতে পারেন।

উদাহরণ: শেষ নাম “佐藤” অথবা “田中” এমন ব্যবহারকারীদের পাওয়া

SELECT * FROM users WHERE name REGEXP '佐藤|田中';

নেগেটিভ ম্যাচিং

বর্গাকার বন্ধনীতে ^ ব্যবহার করলে আপনি “নির্দিষ্ট অক্ষরগুলো না থাকা” ডেটা পুনরুদ্ধার করতে পারেন।

উদাহরণ: “山” ছাড়া অন্য অক্ষর দিয়ে শুরু হওয়া ডেটা

SELECT * FROM users WHERE name REGEXP '^[^山]';

এই ক্ষেত্রে, এটি সেই রেকর্ডগুলো ফেরত দেয় যেখানে নাম দিয়ে শুরু হয় না।

সারসংক্ষেপ

  • MySQL-এ, REGEXP LIKE-এর চেয়ে আরও শক্তিশালী প্যাটার্ন অনুসন্ধান সক্ষম করে।
  • মৌলিক সিনট্যাক্স এবং প্যাটার্ন ( . , ^ , $ , [] , * , + , ইত্যাদি) বোঝা নমনীয় অনুসন্ধানকে সম্ভব করে।
  • LIKE থেকে পার্থক্যগুলো বোঝা এবং প্রতিটিকে যথাযথভাবে ব্যবহার করা গুরুত্বপূর্ণ।
  • | ব্যবহার করে একাধিক প্যাটার্ন দিয়ে অনুসন্ধান করা যায়।
  • নেগেটিভ ক্যারেক্টার ক্লাস [^ ] ব্যবহার করলে নির্দিষ্ট ক্যারেক্টার দিয়ে শুরু না হওয়া ডেটা অনুসন্ধান করতে সাহায্য করে।

3. MySQL 8.0 এবং পরবর্তী সংস্করণে যোগ করা রেগুলার এক্সপ্রেশন ফাংশনগুলি

MySQL 8.0-এ, ঐতিহ্যবাহী REGEXP অপারেটরের পাশাপাশি, চারটি নতুন ফাংশন যোগ করা হয়েছে আরও নমনীয় রেগুলার এক্সপ্রেশন অনুসন্ধান সক্ষম করার জন্য। এগুলো ম্যাচের অবস্থান পুনরুদ্ধার, সাবস্ট্রিং বের করা এবং রিপ্লেসমেন্ট সম্পাদন করা সম্ভব করে, যা MySQL-এ রেজেক্স দিয়ে আপনি যা করতে পারেন তা ব্যাপকভাবে বিস্তৃত করে।

এই বিভাগে, আমরা প্রতিটি নতুন রেগুলার এক্সপ্রেশন ফাংশন বিস্তারিতভাবে ব্যাখ্যা করব এবং বাস্তব উদাহরণ দেখাব।

3.1 REGEXP_LIKE()

সংক্ষিপ্ত বিবরণ

REGEXP_LIKE(), REGEXP অপারেটরের মতোই, একটি কলামের মান নির্দিষ্ট রেজেক্স প্যাটার্নের ম্যাচ করে কিনা পরীক্ষা করে।

সিনট্যাক্স

REGEXP_LIKE(column_name, 'regex_pattern' [, flags])
  • column_name : অনুসন্ধান করার কলাম
  • 'regex_pattern' : শর্ত হিসেবে ব্যবহৃত রেজেক্স প্যাটার্ন
  • flags (optional) : কেস সংবেদনশীলতা (কেস-ইনসেনসিটিভ ম্যাচের জন্য i ব্যবহার করুন)

উদাহরণ

“ইমেইল gmail.com অথবা yahoo.co.jp দিয়ে শেষ হওয়া ব্যবহারকারীদের পান”

SELECT * FROM users WHERE REGEXP_LIKE(email, '(@gmail\.com|@yahoo\.co\.jp)$');

“’admin’ অন্তর্ভুক্ত করা ইউজারনেম (কেস-ইনসেনসিটিভ) অনুসন্ধান করুন”

SELECT * FROM users WHERE REGEXP_LIKE(username, 'admin', 'i');

REGEXP_LIKE() REGEXP অপারেটরের মতোই কাজ করে, তবে এটি আরও স্ট্যান্ডার্ড‑SQL‑বন্ধু স্টাইল প্রদান করে।

3.2 REGEXP_INSTR()

সংক্ষিপ্ত বিবরণ

REGEXP_INSTR() একটি স্ট্রিংয়ের মধ্যে রেজেক্স ম্যাচের অবস্থান (শুরু সূচক) ফেরত দেয়।

সিনট্যাক্স

REGEXP_INSTR(column_name, 'regex_pattern' [, start_position, occurrence, return_option, flags])
  • start_position (optional): অনুসন্ধান শুরু করার স্থান (ডিফল্ট: ১)
  • occurrence (optional): কোন ম্যাচের উপস্থিতি ফেরত দিতে হবে (ডিফল্ট: ১)
  • return_option (optional): (শুরু অবস্থান ফেরত দেয়) অথবা (ম্যাচের শেষ অবস্থান ফেরত দেয়)
  • flags (optional): কেস-ইনসেনসিটিভ ম্যাচের জন্য i ব্যবহার করুন

উদাহরণ

“ফোন নম্বর যদি 090 অথবা 080 দিয়ে শুরু হয়, তাহলে শুরু অবস্থান পান”

SELECT phone, REGEXP_INSTR(phone, '^(090|080)') AS match_pos FROM users;

“ইমেইল ঠিকানার ডোমেইন অংশের শুরু অবস্থান পান”

SELECT email, REGEXP_INSTR(email, '@') AS domain_start FROM users;
  • এটি @ চিহ্নের অবস্থান ফেরত দেয় (যেমন, user@example.com-এ এটি 5 ফেরত দেয়)।

REGEXP_INSTR() ব্যবহার করে আপনি অবস্থানগত তথ্য পুনরুদ্ধার করতে পারেন, যা স্ট্রিং প্রক্রিয়াকরণের বিকল্পগুলোকে বিস্তৃত করে।

3.3 REGEXP_SUBSTR()

সংক্ষিপ্ত বিবরণ

REGEXP_SUBSTR() একটি স্ট্রিংয়ের মধ্যে রেজেক্স প্যাটার্নের সাথে মিলে যাওয়া সাবস্ট্রিংটি বের করে

সিনট্যাক্স

REGEXP_SUBSTR(column_name, 'regex_pattern' [, start_position, occurrence, flags])
  • occurrence (optional): nth ম্যাচ পেতে (ডিফল্ট: ১)
  • flags (optional): কেস সংবেদনশীলতা (i ব্যবহার করে কেস উপেক্ষা করা যায়)

উদাহরণ

“ইমেইল ঠিকানার শুধুমাত্র ডোমেইন অংশটি বের করুন”

SELECT email, REGEXP_SUBSTR(email, '@[a-zA-Z0-9.-]+') AS domain FROM users;

“একটি মেসেজে প্রথম সংখ্যার ক্রমটি পান”

SELECT message, REGEXP_SUBSTR(message, '[0-9]+') AS first_number FROM logs;

REGEXP_SUBSTR() দিয়ে আপনি নির্দিষ্ট প্যাটার্ন বের করতে পারেন এবং ডেটা সংগঠন ও রূপান্তরের জন্য ব্যবহার করতে পারেন।

3.4 REGEXP_REPLACE()

সংক্ষিপ্ত বিবরণ

REGEXP_REPLACE() রেজেক্স প্যাটার্নের সাথে মিলে যাওয়া সাবস্ট্রিংগুলোকে অন্য একটি স্ট্রিং দিয়ে প্রতিস্থাপন করে

সিনট্যাক্স

REGEXP_REPLACE(column_name, 'regex_pattern', 'replacement' [, occurrence, flags])
  • replacement : মিলিত অংশের সাথে প্রতিস্থাপন করার জন্য স্ট্রিং
  • occurrence (ঐচ্ছিক): শুধুমাত্র nth মিল প্রতিস্থাপন করুন (যদি বাদ দেওয়া হয়, সব মিল প্রতিস্থাপন করে)
  • flags (ঐচ্ছিক): কেস-অসংবেদনশীল মিলের জন্য i ব্যবহার করুন

Examples

“ফোন নম্বর থেকে হাইফেন (-) সরান”

SELECT phone, REGEXP_REPLACE(phone, '-', '') AS clean_phone FROM users;

“HTML ট্যাগ সরান”

SELECT comment, REGEXP_REPLACE(comment, '<[^>]+>', '') AS clean_text FROM reviews;

REGEXP_REPLACE() এর সাথে, ফরম্যাট রূপান্তর এবং ডেটা ক্লিনিং সহজ হয়ে যায়

3.5 Summary

FunctionPurposeExample
REGEXP_LIKE()Check whether a value matches a regex patternSELECT * FROM users WHERE REGEXP_LIKE(email, '@gmail\.com$');
REGEXP_INSTR()Get the start position of the matched substringSELECT REGEXP_INSTR(email, '@') FROM users;
REGEXP_SUBSTR()Extract the matched substringSELECT REGEXP_SUBSTR(email, '@[a-zA-Z0-9.-]+') FROM users;
REGEXP_REPLACE()Replace the matched substringSELECT REGEXP_REPLACE(phone, '-', '') FROM users;

4. MySQL Regular Expressions-এর ব্যবহারিক উদাহরণ

MySQL regular expressions ব্যবহার করে, আপনি ডেটা যাচাইকরণ, নির্দিষ্ট ডেটা নিষ্কাশন, এবং ফরম্যাট রূপান্তর এর মতো বাস্তব-বিশ্বের ডেটা প্রক্রিয়াকরণ কাজগুলি সহজতর করতে পারেন। এই বিভাগে, আমরা SQL কোড এবং ব্যাখ্যাসহ ব্যবহারিক ব্যবহারের ক্ষেত্রসমূহ পরিচয় করাচ্ছি।

4.1 ইমেইল ঠিকানা যাচাইকরণ

Overview

ডেটাবেসে সংরক্ষিত ইমেইল ঠিকানাগুলি বৈধ ফরম্যাট অনুসরণ করে কিনা তা পরীক্ষা করার জন্য regular expressions ব্যবহার করুন।

SQL to Use

SELECT email FROM users 
WHERE email REGEXP '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$';

Explanation

  • ^[a-zA-Z0-9._%+-]+@ এর আগে এক বা একাধিক অক্ষরময় অঙ্ক, ডট, আন্ডারস্কোর, বা প্লাস চিহ্ন
  • @[a-zA-Z0-9.-]+@ এর পরে একটি ডোমেইন নাম
  • \.[a-zA-Z]{2,}$ → কমপক্ষে ২ অক্ষরের TLD (Top-Level Domain) দিয়ে শেষ হয় (যেমন, .com , .jp , .net )

এই ক্যোয়েরির সাথে, আপনি অবৈধ ইমেইল ঠিকানা বাদ দিতে পারেন (যেমন, user@@example.com, user@.com)।

4.2 জাপানি ফোন নম্বর ফরম্যাট পরীক্ষা

Overview

সাধারণ জাপানি ফোন নম্বরগুলি (যেমন, 090-1234-5678, 03-1234-5678) সঠিক ফরম্যাট অনুসরণ করে কিনা তা নির্ধারণ করুন।

SQL to Use

SELECT phone FROM users 
WHERE phone REGEXP '^(0[789]0-[0-9]{4}-[0-9]{4}|0[1-9]-[0-9]{4}-[0-9]{4})$';

Explanation

  • 0[789]0-[0-9]{4}-[0-9]{4} → মোবাইল নম্বর ( 090-xxxx-xxxx , 080-xxxx-xxxx , ইত্যাদি)
  • 0[1-9]-[0-9]{4}-[0-9]{4} → ল্যান্ডলাইন ( 03-xxxx-xxxx , 06-xxxx-xxxx , ইত্যাদি)

এইভাবে, regular expressions ফরম্যাটের সামঞ্জস্যতা প্রয়োজন হলে উপকারী

4.3 ক্রেডিট কার্ড নম্বর ফরম্যাট যাচাইকরণ

Overview

ক্রেডিট কার্ড নম্বরগুলির ফরম্যাট যাচাই করুন (Visa, Mastercard, American Express, ইত্যাদি)।

SQL to Use

SELECT card_number FROM payments 
WHERE card_number REGEXP '^(4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13})$';

Explanation

  • ^4[0-9]{12}(?:[0-9]{3})?$ → Visa (১৬ অঙ্ক বা ১৩ অঙ্ক)
  • ^5[1-5][0-9]{14}$ → Mastercard (১৬ অঙ্ক)
  • ^3[47][0-9]{13}$ → American Express (১৫ অঙ্ক)

এই ক্যোয়েরির সাথে, আপনি ডেটাবেস থেকে অবৈধ কার্ড নম্বর ফিল্টার করতে পারেন (যেমন, ভুল দৈর্ঘ্য বা অবৈধ শুরুর অঙ্ক)।

4.4 HTML ট্যাগ সরান

Overview

যদি ব্যবহারকারী-জমা দেওয়া ডেটায় HTML ট্যাগ থাকে, তাহলে তাদের সরিয়ে কনটেন্টকে সাধারণ টেক্সটে রূপান্তর করুন

SQL to Use

SELECT REGEXP_REPLACE(comment, '<[^>]+>', '') AS clean_comment FROM reviews;

Explanation

  • '<[^>]+>'< এবং > এর মধ্যে সব HTML ট্যাগ সরায়

Example

InputOutput
<b>Hello</b> World!Hello World!
<p>これはサンプルです</p>これはサンプルです

এটি ব্যবহারকারীর মন্তব্য এবং ব্লগ পোস্ট থেকে HTML ট্যাগ সরানোর জন্য উপকারী

4.5 পোস্টাল কোড ফরম্যাট যাচাইকরণ (জাপান)

Overview

জাপানি পোস্টাল কোডগুলি (যেমন, 123-4567) সঠিক ফরম্যাট অনুসরণ করে কিনা তা যাচাই করুন।

SQL to Use

SELECT postal_code FROM addresses 
WHERE postal_code REGEXP '^[0-9]{3}-[0-9]{4}$';

Explanation

  • ^[0-9]{3}-[0-9]{4}$“3 অঙ্ক-4 অঙ্ক” ফরম্যাটে একটি পোস্টাল কোড

এই regex ব্যবহার করে ডেটা সামঞ্জস্যতা বজায় রাখতে এবং ভুল ফরম্যাট প্রতিরোধ করতে সাহায্য করে

4.6 ইউজারনেম ফিল্টারিং (অনুমোদিত শব্দ সনাক্তকরণ)

Overview

Check whether usernames contain disallowed words reserved for system use (e.g., admin, root, system) during registration.

ব্যবহারযোগ্য SQL

SELECT username FROM users 
WHERE username REGEXP 'admin|root|system';

ব্যাখ্যা

  • admin|root|system → এই শব্দগুলো ধারণকারী ব্যবহারকারীর নাম সনাক্ত করে

এই কুয়েরি নিয়মিত ব্যবহারকারীদের সিস্টেম প্রশাসকের জন্য নির্ধারিত নাম ব্যবহার করা থেকে রোধ করতে সহায়তা করে

সারাংশ

  • রেগুলার এক্সপ্রেশন ব্যবহার করা যায় ইমেইল ঠিকানা, ফোন নম্বর এবং ক্রেডিট কার্ড নম্বর যাচাই করার জন্য
  • এগুলো HTML ট্যাগ মুছে ফেলা এবং ডেটা ফরম্যাট রূপান্তর করার জন্যও ব্যবহার করা যায়।
  • নিষিদ্ধ শব্দ ফিল্টার করা এবং পোস্টাল কোড যাচাই করা ইত্যাদি কাজের মাধ্যমে ডেটাবেসের নিরাপত্তা ও সামঞ্জস্যতা উন্নত করতে এগুলো কার্যকর।

5. রেগুলার এক্সপ্রেশন ব্যবহার করার সময় গুরুত্বপূর্ণ বিবেচ্য বিষয় (পারফরম্যান্স এবং নিরাপত্তা)

MySQL-এ রেগুলার এক্সপ্রেশন ব্যবহার করলে শক্তিশালী অনুসন্ধান ও ডেটা ক্লিনসিং সম্ভব হয়। তবে, ভুল ব্যবহার পারফরম্যান্স হ্রাস এবং নিরাপত্তা ঝুঁকি সৃষ্টি করতে পারে। এই অংশে MySQL রেগুলার এক্সপ্রেশন নিরাপদ ও কার্যকরভাবে ব্যবহার করার মূল বিবেচ্য বিষয়গুলো ব্যাখ্যা করা হয়েছে।

5.1 রেগুলার এক্সপ্রেশনের পারফরম্যান্স অপ্টিমাইজেশন

MySQL রেগেক্স অনুসন্ধান সুবিধাজনক, তবে এর একটি অসুবিধা আছে: ইনডেক্স সাধারণত প্রয়োগ হয় না, যা কুয়েরিগুলোকে ধীর করে তুলতে পারে

পারফরম্যান্স উন্নত করার উপায়

  1. LIKE অথবা FULLTEXT ইনডেক্স একত্রিত করুন
    SELECT * FROM users WHERE email LIKE '%gmail.com';
    
  1. সহজ রেগুলার এক্সপ্রেশন ব্যবহার করুন
    SELECT * FROM users WHERE name REGEXP '^admin|admin$';
    
  1. প্রথমে লক্ষ্য ডেটা ফিল্টার করুন
    SELECT * FROM users WHERE email LIKE 'a%' AND email REGEXP '^[a-zA-Z0-9._%+-]+@gmail\.com$';
    

5.2 নিরাপত্তা ঝুঁকি এবং প্রতিকার

1. রেগুলার এক্সপ্রেশন DoS (ReDoS)

  • .* এর মতো অনির্দিষ্ট ম্যাচ এড়িয়ে চলুন।
  • অনুসন্ধানের পরিসীমা সীমিত করতে ^ এবং $ ব্যবহার করুন।
  • ব্যবহারকারীর ইনপুট সরাসরি REGEXP-এ পাস করবেন না।

2. SQL ইনজেকশন এবং রেগুলার এক্সপ্রেশন

অসুরক্ষিত কুয়েরি

SELECT * FROM users WHERE username REGEXP '$input';

সুরক্ষিত কুয়েরি (প্লেসহোল্ডার ব্যবহার করুন)

$stmt = $pdo->prepare("SELECT * FROM users WHERE username REGEXP ?");
$stmt->execute([$sanitized_input]);

5.3 সংস্করণ সামঞ্জস্যতা

VersionMain Features
MySQL 5.xOnly the REGEXP operator is available
MySQL 8.xAdds REGEXP_LIKE(), REGEXP_INSTR(), REGEXP_SUBSTR(), and REGEXP_REPLACE()

সারাংশ

  • REGEXP ইনডেক্স ব্যবহার না করার কারণে, পারফরম্যান্স ব্যবস্থা গুরুত্বপূর্ণ।
  • ReDoS (রেগুলার এক্সপ্রেশন DoS) রোধ করতে, অতিরিক্ত ওয়াইল্ডকার্ড ব্যবহার এড়িয়ে চলুন।
  • SQL ইনজেকশন রোধ করতে, ব্যবহারকারীর ইনপুট সরাসরি REGEXP-এ প্রয়োগ করবেন না।

6. FAQ (প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী)

MySQL রেগুলার এক্সপ্রেশন (REGEXP) ব্যবহারের সাধারণ প্রশ্নগুলো এখানে দেওয়া হল। এই সমস্যাগুলো সমাধান করলে আপনি রেগেক্স আরও কার্যকরভাবে ব্যবহার করতে পারবেন।


6.1 MySQL-এ আমি কোন রেগেক্স প্যাটার্ন ব্যবহার করতে পারি?

SymbolDescriptionExampleResult
.Any single charactera.c"abc", "aac", "adc"
^Start of the string^abc"abcde" (does not match "dabc")
$End of the stringxyz$"axyz" (does not match "xyzb")
[]Any of the specified characters[abc]"a", "b", "c"
[^]Any character not in the specified set[^abc]Any character except "a", "b", "c"
*Repeat the preceding character 0 or more timesa*"", "a", "aa", "aaa"
+Repeat the preceding character 1 or more timesa+"a", "aa", "aaa" (does not match "")

6.2 LIKE এবং REGEXP এর পার্থক্য কী?

ComparisonLIKEREGEXP
FunctionalitySimple pattern matchingSearching with complex regular expressions
Wildcards% (any string), _ (any single character).* (any string), ^, $, [a-z], etc.
Search speedFast because indexes can applyOften slower due to full table scans
Use casesSimple searches (contains, prefix matching, etc.)Complex searches based on specific patterns

LIKE দ্রুত হওয়ায়, সহজ অনুসন্ধানের জন্য LIKE ব্যবহার করুন এবং জটিল ম্যাচের জন্য REGEXP ব্যবহার করুন।

6.3 MySQL 5.x এবং MySQL 8.x এর রেগেক্স ফিচারগুলোর পার্থক্য কী?

VersionMain Features
MySQL 5.xOnly the REGEXP operator is available
MySQL 8.xAdds REGEXP_LIKE(), REGEXP_INSTR(), REGEXP_SUBSTR(), and REGEXP_REPLACE()

6.4 রেগেক্স প্রত্যাশিতভাবে কাজ না করলে আমি কী করব?

চেকলিস্ট

  1. এস্কেপ সঠিক আছে কিনা পরীক্ষা করুন
    SELECT * FROM users WHERE email REGEXP '\.com$';
    
  1. REGEXP_LIKE()-এ i ফ্ল্যাগ ব্যবহার করে দেখুন
    SELECT * FROM users WHERE REGEXP_LIKE(username, 'admin', 'i');
    
  1. ডেটা এনকোডিং পরীক্ষা করুন
    SHOW VARIABLES LIKE 'character_set_database';
    

6.5 REGEXP কুয়েরির পারফরম্যান্স কীভাবে উন্নত করতে পারি?

  1. LIKE দিয়ে প্রি-ফিল্টার করুন
    SELECT * FROM users 
    WHERE email LIKE '%gmail.com' 
    AND email REGEXP '^[a-zA-Z0-9._%+-]+@gmail\.com$';
    
  1. প্রয়োজন অনুযায়ী ইনডেক্স ব্যবহার করুন
    ALTER TABLE users ADD FULLTEXT(email);
    

সারাংশ

  • REGEXP হল LIKE এর চেয়ে বেশি শক্তিশালী, তবে আপনাকে পারফরম্যান্সের প্রতি সতর্ক থাকতে হবে।
  • MySQL 8.0-এ, নতুন রেজেক্স ফাংশন (যেমন REGEXP_LIKE()) যোগ করা হয়েছে, যা আরও নমনীয় প্রক্রিয়াকরণ সম্ভব করে।
  • পারফরম্যান্স বাড়াতে: LIKE এর সাথে সংযুক্ত করুন, ইনডেক্স ব্যবহার করুন, এবং সহজ রেজেক্স প্যাটার্ন ডিজাইন করুন।

7. সংক্ষিপ্তসার

MySQL রেগুলার এক্সপ্রেশন (REGEXP) ডেটা অনুসন্ধান, ভ্যালিডেশন এবং ফরম্যাট রূপান্তরের জন্য অত্যন্ত উপযোগী। এই প্রবন্ধে MySQL রেজেক্সের মৌলিক বিষয়, MySQL 8.0 এবং পরবর্তী সংস্করণে যোগ করা নতুন ফিচার, ব্যবহারিক উদাহরণ, গুরুত্বপূর্ণ বিবেচনা এবং FAQ কভার করা হয়েছে।

7.1 মূল বিষয়বস্তু

এখানে সবচেয়ে গুরুত্বপূর্ণ পয়েন্টগুলোর দ্রুত পুনরালোচনা দেওয়া হল।

1. MySQL রেগুলার এক্সপ্রেশন মৌলিক বিষয়

  • REGEXP অপারেটর ব্যবহার করে LIKE এর তুলনায় আরও নমনীয় প্যাটার্ন ম্যাচিং সম্ভব হয়।
  • সাধারণ রেজেক্স প্যাটার্নসমূহ
  • ^ (শুরু), $ (শেষ), . (যেকোনো একক অক্ষর), [] (অক্ষর ক্লাস), + (এক বা একাধিক পুনরাবৃত্তি), ইত্যাদি।

2. MySQL 8.0+ এ নতুন রেগুলার এক্সপ্রেশন ফাংশন

MySQL 8.0-এ, এই চারটি ফাংশন যোগ করা হয়েছে, যা আরও নমনীয় প্রক্রিয়াকরণ সম্ভব করে:

  • REGEXP_LIKE() : REGEXP অপারেটরের বিকল্প
  • REGEXP_INSTR() : মেলানো সাবস্ট্রিংয়ের শুরুর অবস্থান পাওয়া
  • REGEXP_SUBSTR() : মেলানো সাবস্ট্রিং বের করা
  • REGEXP_REPLACE() : রেজেক্স ব্যবহার করে সাবস্ট্রিং প্রতিস্থাপন

3. ব্যবহারিক উদাহরণ

  • ইমেইল ঠিকানা যাচাই
  • ফোন নম্বর এবং ক্রেডিট কার্ড নম্বর যাচাই
  • HTML ট্যাগ সরানো
  • পোস্টাল কোড ফরম্যাট যাচাই
  • অননুমোদিত শব্দ সনাক্তকরণ
  • ডেটা পরিষ্কার (হোয়াইটস্পেস ট্রিম করা, কমা সরানো, ইত্যাদি)

4. রেগুলার এক্সপ্রেশন ব্যবহার করার সময় গুরুত্বপূর্ণ বিবেচনা

  • পারফরম্যান্স অপ্টিমাইজেশন
  • কারণ REGEXP ইনডেক্স ব্যবহার করে না, তাই এটি পূর্ণ টেবিল স্ক্যান ঘটাতে পারে।
  • আপনি LIKE বা FULLTEXT ইনডেক্সের সাথে সংযুক্ত করে পারফরম্যান্স বাড়াতে পারেন।
  • সিকিউরিটি ব্যবস্থা
  • ReDoS (রেজেক্স DoS) প্রতিরোধে .* এর অতিরিক্ত ব্যবহার এড়িয়ে চলুন।
  • SQL ইনজেকশন প্রতিরোধে placeholders ব্যবহার করুন।

5. FAQ (প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী)

  • MySQL-এ উপলব্ধ রেজেক্স প্যাটার্নসমূহ
  • LIKE এবং REGEXP এর পার্থক্য
  • MySQL 5.x এবং 8.x এর ফিচার পার্থক্য
  • রেজেক্স প্রত্যাশিতভাবে কাজ না করলে ট্রাবলশুটিং
  • পারফরম্যান্স বাড়ানোর উপায়

7.2 রেজেক্স ব্যবহার করার সেরা পদ্ধতি

  1. রেজেক্স প্যাটার্ন সহজ রাখুন
  • উদাহরণ: .* অতিরিক্ত ব্যবহার এড়িয়ে ^ (শুরু) এবং $ (শেষ) ব্যবহার করুন।
  1. প্রয়োজন অনুযায়ী LIKE বা FULLTEXT এর সাথে সংযুক্ত করুন
  • প্রথমে LIKE দিয়ে প্রি-ফিল্টার করুন, তারপর REGEXP প্রয়োগ করে কুয়েরি খরচ কমান।
  1. ডেটা পরিষ্কারের জন্য REGEXP_REPLACE() ব্যবহার করুন
  • উদাহরণ: HTML ট্যাগ সরিয়ে অপ্রয়োজনীয় স্পেস স্বাভাবিক করুন।
  1. MySQL 8.0 এবং পরের সংস্করণ ব্যবহার করুন
  • REGEXP_LIKE() এর মতো নতুন ফাংশন ব্যবহার করলে SQL আরও পাঠযোগ্য হয়।
  1. সিকিউরিটি ব্যবস্থা সম্পূর্ণভাবে প্রয়োগ করুন
  • ব্যবহারকারীর ইনপুট সরাসরি REGEXP এ ব্যবহার করবেন না (SQL ইনজেকশন প্রতিরোধ)।
  • ডাইনামিক কুয়েরির জন্য placeholders ব্যবহার করুন।

7.3 আরও শিখতে রিসোর্স

এখানে MySQL রেগুলার এক্সপ্রেশন আরও গভীরভাবে শিখতে সহায়ক রেফারেন্সগুলো দেওয়া হল।

অফিশিয়াল ডকুমেন্টেশন

7.4 শেষ নোট

MySQL রেগুলার এক্সপ্রেশন ডেটা অনুসন্ধান, পরিষ্কার এবং ভ্যালিডেশনসহ বিভিন্ন পরিস্থিতিতে ব্যবহার করা যায়। তবে পারফরম্যান্স এবং সিকিউরিটি বিবেচনা বুঝে সঠিকভাবে ব্যবহার করা গুরুত্বপূর্ণ।

আমরা আশা করি এই প্রবন্ধটি MySQL রেগুলার এক্সপ্রেশন নিয়ে কাজ করার সময় আপনার সহায়তা করবে। আপনার প্রকল্পে এই টেকনিকগুলো প্রয়োগ করে দেখুন!