MySQL नियमित अभिव्यक्तियाँ (Regexp)
⚡ स्मार्ट सारांश
MySQL रेगुलर एक्सप्रेशन (REGEXP) कॉलम मानों का मिलान उन लचीले पैटर्न से करते हैं जिन्हें वाइल्डकार्ड व्यक्त नहीं कर सकते। यह REGEXP सिंटैक्स, RLIKE पर्यायवाची, प्रत्येक समर्थित मेटाकैरेक्टर, myflixdb डेटाबेस के विरुद्ध सही क्वेरी उदाहरण और इसमें जोड़े गए रेगुलर एक्सप्रेशन फ़ंक्शन की व्याख्या करता है। MySQL 8.0.

क्या हैं MySQL नियमित अभिव्यक्तियाँ?
MySQL नियमित अभिव्यक्ति यह आपको जटिल मानदंडों से मेल खाने वाले डेटा को खोजने में मदद करता है। रेगुलर एक्सप्रेशन एक पैटर्न है जो उस मान के आकार का वर्णन करता है जिसे आप खोज रहे हैं, न कि स्वयं मान का।
यदि आपने पहले ही इनके साथ काम किया है MySQL वाइल्डकार्डआप शायद यह पूछें कि जब LIKE से भी समान परिणाम मिलते हैं तो रेगुलर एक्सप्रेशन सीखना क्यों उपयोगी है? इसका उत्तर है अभिव्यंजक शक्ति: वाइल्डकार्ड केवल दो प्रतीक प्रदान करते हैं, जबकि रेगुलर एक्सप्रेशन एक ही पैटर्न में वर्णों की सीमा, विकल्प, पुनरावृति और शब्दों की स्थिति का वर्णन करते हैं।
उद्देश्य स्पष्ट हो जाने के बाद, अगले भाग में उस सिंटैक्स का परिचय दिया गया है जिसका उपयोग आप प्रत्येक REGEXP क्वेरी में करेंगे।
REGEXP का मूल सिंटैक्स
रेगुलर एक्सप्रेशन का मूल सिंटैक्स इस प्रकार है।
SELECT * FROM table_name WHERE fieldname REGEXP 'pattern';
यहाँ:
- “SELECT कथन” मानक है चयन कथन.
- “WHERE फ़ील्डनाम” यह उस कॉलम का नाम है जिस पर रेगुलर एक्सप्रेशन लागू किया जाता है।
- “REGEXP 'पैटर्न'” — REGEXP रेगुलर एक्सप्रेशन ऑपरेटर है, और 'पैटर्न' मिलान किए जाने वाले पैटर्न को दर्शाता है। आरलाइक एक REGEXP का समानार्थी शब्द और यह समान परिणाम देता है। इसे LIKE ऑपरेटर से भ्रमित होने से बचाने के लिए, REGEXP का उपयोग करना बेहतर है।
आइए अब एक व्यावहारिक उदाहरण देखें।
SELECT * FROM `movies` WHERE `title` REGEXP 'code';
उपरोक्त क्वेरी उन सभी फ़िल्मों के शीर्षक खोजती है जिनमें "कोड" शब्द मौजूद है। इससे कोई फर्क नहीं पड़ता कि "कोड" शीर्षक के शुरू में, बीच में या अंत में आता है। जब तक शीर्षक में यह पैटर्न मौजूद है, पंक्ति प्रदर्शित की जाएगी।
किसी मान की शुरुआत का वर्ण सूची से मिलान करना
मान लीजिए कि हम उन फिल्मों को खोजना चाहते हैं जिनके शीर्षक a, b, c, या d से शुरू होते हैं, और उसके बाद अन्य कितने भी अक्षर आ सकते हैं। इस परिणाम को प्राप्त करने के लिए हम अक्षरों की सूची को कैरेट मेटाकैरेक्टर के साथ जोड़ते हैं।
SELECT * FROM `movies` WHERE `title` REGEXP '^[abcd]';
उपरोक्त स्क्रिप्ट को निष्पादित करना MySQL कार्यक्षेत्र myflixdb डेटाबेस के विरुद्ध परीक्षण करने पर हमें निम्नलिखित परिणाम प्राप्त होते हैं।
| मूवी_आईडी | शीर्षक | निदेशक | वर्ष_रिलीज़ | श्रेणी_आईडी |
|---|---|---|---|---|
| 4 | Code नाम ब्लैक | एडगर जिम्ज़ | 2010 | नल |
| 5 | डैडीज लिटिल गर्ल्स | नल | 2007 | 8 |
| 6 | स्वर्गदूत और राक्षस | नल | 2007 | 6 |
| 7 | दा विंची Code | नल | 2007 | 6 |
पैटर्न '^[abcd]' में, कैरेट (^) के लिए मिलान मान के प्रारंभ से शुरू होना आवश्यक है, और वर्ण सूची [abcd] केवल उन शीर्षकों को स्वीकार करती है जिनका पहला अक्षर a, b, c, या d है। डिफ़ॉल्ट कोलेशन के तहत तुलना केस-संवेदनशील नहीं है, यही कारण है कि “Code "नाम ब्लैक" वापस आ गया है।
नकारात्मक वर्ण सूची वाले वर्णों को छोड़कर
अब आइए स्क्रिप्ट को संशोधित करें और वर्ण सूची को उलट दें ताकि यह देखा जा सके कि कौन सी पंक्तियाँ वापस आती हैं।
SELECT * FROM `movies` WHERE `title` REGEXP '^[^abcd]';
उपरोक्त स्क्रिप्ट को निष्पादित करना MySQL myflixdb डेटाबेस के विरुद्ध वर्कबेंच चलाने पर हमें निम्नलिखित परिणाम प्राप्त होते हैं।
| मूवी_आईडी | शीर्षक | निदेशक | वर्ष_रिलीज़ | श्रेणी_आईडी |
|---|---|---|---|---|
| 1 | कैरिबियन के समुद्री डाकू 4 | रॉब मार्शल | 2011 | 1 |
| 2 | सारा मार्शल को भूलना | निकोलस Stoller | 2008 | 2 |
| 3 | एक्स पुरुष | 2008 | ||
| 9 | Honey moonनेताओं | जॉन शुल्त्ज़ | 2005 | 8 |
| 16 | 67% दोषी | 2012 | ||
| 17 | द ग्रेट डिक्टेटर | चार्ली चैपली | 1920 | 7 |
| 18 | नमूना फिल्म | गुमनाम | 8 | |
| 19 | फिल्म ४ | जॉन ब्राउन | 1920 | 8 |
किसी वर्ण सूची के अंदर, कैरट का अर्थ बदल जाता है: '^[^abcd]' अभी भी शुरुआत में मिलान को स्थिर करता है, जबकि [^abcd] अब उन सभी शीर्षकों को बाहर कर देता है जो संलग्न वर्णों में से किसी एक से शुरू होते हैं।
इन दोनों उदाहरणों में केवल एंकर और कैरेक्टर लिस्ट का उपयोग किया गया है। अगले भाग में संपूर्ण मेटाकैरेक्टर सेट को शामिल किया गया है।
नियमित अभिव्यक्ति मेटाअक्षर
ऊपर दिए गए उदाहरण एक नियमित अभिव्यक्ति का सबसे सरल रूप दिखाते हैं। वर्ण आपको पैटर्न खोज को बेहतर बनाने की अनुमति देते हैं: वे पुनरावृत्ति, विकल्प, सीमाएँ और स्थितियाँ व्यक्त करते हैं। नीचे दी गई तालिका नियमित अभिव्यक्ति द्वारा समर्थित प्रत्येक मेटाकैरेक्टर को सूचीबद्ध करती है। MySQL REGEXP ऑपरेटर, प्रत्येक के लिए एक सही उदाहरण सहित।
| चार | विवरण | उदाहरण | |
|---|---|---|---|
| * | RSI तारांकन (*) शून्य (0) या अधिक उदाहरणों से मेल खाता है एकल वर्ण जो इससे पहले है। | SELECT * FROM movies WHERE title REGEXP 'da*'; यह एक ऐसे “d” से मेल खाता है जिसके बाद शून्य या अधिक “a” अक्षर होते हैं, इसलिए दा विंची Code और डैडीज़ लिटिल गर्ल्स भी इसमें शामिल हैं। जब अक्षर "a" का होना अनिवार्य हो, तो 'da+' का प्रयोग करें। | |
| + | RSI प्लस (+) यह अपने से पहले वाले अक्षर के एक या अधिक उदाहरणों से मेल खाता है। | SELECT * FROM `movies` WHERE `title` REGEXP 'mon+'; यह उन सभी फिल्मों को दिखाता है जिनमें "mon" के बाद एक या अधिक "n" अक्षर आते हैं। उदाहरण के लिए, Angels and Demons। | |
| ? | RSI प्रश्न चिह्न (?) यह शून्य (0) या उससे पहले वाले अक्षर के एक उदाहरण से मेल खाता है। | SELECT * FROM `categories` WHERE `category_name` REGEXP 'com?'; यह शब्द “co” के साथ वैकल्पिक “m” का मिलान करता है। उदाहरण के लिए, कॉमेडी और रोमांटिक कॉमेडी। | |
| . | RSI डॉट (.) यह नई पंक्ति को छोड़कर किसी भी एक अक्षर से मेल खाता है। | SELECT * FROM movies WHERE `year_released` REGEXP '200.'; यह उन सभी फिल्मों को दिखाता है जो किसी ऐसे वर्ष में रिलीज़ हुई हों जिसका पहला अक्षर “200” हो और उसके बाद कोई भी एक अक्षर हो। उदाहरण के लिए, 2005, 2007, 2008। | |
| [एबीसी] | RSI वर्ण सूची [abc] संलग्न अक्षरों में से किसी एक से मेल खाता है। | SELECT * FROM `movies` WHERE `title` REGEXP '[vwxyz]'; यह उन सभी फिल्मों को दिखाता है जिनमें “vwxyz” से कोई एक पात्र मौजूद हो। उदाहरण के लिए, X-Men और Da Vinci। Code. | |
| [^एबीसी] | RSI नकारात्मक सूची [^abc] यह संलग्न वर्णों को छोड़कर किसी भी वर्ण से मेल खाता है। | SELECT * FROM `movies` WHERE `title` REGEXP '^[^vwxyz]'; उन सभी फिल्मों की सूची देता है जिनके शीर्षक की शुरुआत "vwxyz" अक्षर से नहीं होती है। | |
| [AZ] | RSI रेंज [AZ] यह किसी भी बड़े अक्षर से मेल खाता है। | SELECT * FROM `members` WHERE `postal_address` REGEXP '[AZ]'; उन सभी सदस्यों की सूची देता है जिनके डाक पते में A से Z के बीच का कोई अक्षर आता है। उदाहरण के लिए, जेनेट जोन्स, जिनकी सदस्यता संख्या 1 है। | |
| [az] | RSI रेंज [az] यह किसी भी छोटे अक्षर से मेल खाता है। | SELECT * FROM `members` WHERE `postal_address` REGEXP '[az]'; उन सभी सदस्यों को दिखाता है जिनके डाक पते में 'a' और 'z' के बीच का कोई अक्षर आता है। ध्यान दें कि डिफ़ॉल्ट कोलेशन केस-इनसेंसिटिव है, इसलिए यह श्रेणी बड़े अक्षरों को भी शामिल करती है। | |
| [0 - 9] | RSI रेंज [0-9] यह 0 से 9 तक के किसी भी अंक से मेल खाता है। | SELECT * FROM `members` WHERE `contact_number` REGEXP '[0-9]'; उन सभी सदस्यों के नाम देता है जिनके संपर्क नंबर में कम से कम एक अंक होता है। उदाहरण के लिए, रॉबर्ट फिल। | |
| ^ | RSI कैरेट (^) यह मैच को मूल्य की शुरुआत से जोड़ता है। | SELECT * FROM `movies` WHERE `title` REGEXP '^[cd]'; यह उन सभी फिल्मों की सूची देता है जिनके शीर्षक "c" या "d" से शुरू होते हैं। उदाहरण के लिए, Code नेम ब्लैक, डैडीज़ लिटिल गर्ल्स और दा विंची Code. | |
| $ | RSI डॉलर चिह्न ($) यह मैच को मूल्य के अंत से जोड़ता है। | SELECT * FROM `movies` WHERE `title` REGEXP 'code$'; उन सभी फिल्मों की सूची देता है जिनके शीर्षक के अंत में "कोड" आता है। उदाहरण के लिए, दा विंची Code. | |
| | | RSI ऊर्ध्वाधर पट्टी (|) विकल्पों को अलग करता है। | SELECT * FROM `movies` WHERE `title` REGEXP '^[cd]|^[u]'; यह उन सभी फिल्मों की सूची देता है जिनके शीर्षक "c", "d" या "u" से शुरू होते हैं। उदाहरण के लिए, Code नाम ब्लैक, दा विंची Codeऔर अंडरवर्ल्ड – Awakenआईएनजी. | |
| \b | RSI शब्द सीमा (\b) यह किसी शब्द के प्रारंभ या अंत से मेल खाता है। यह पुराने [[:<:]] और [[:>:]] चिह्नों को प्रतिस्थापित करता है, जो MySQL 8.0 हटा दिया गया। | SELECT * FROM `movies` WHERE `title` REGEXP '\\bfor'; यह उन सभी फिल्मों की सूची देता है जिनका पहला शब्द "for" से शुरू होता है। उदाहरण के लिए, Forgetting Sarah Marshal। MySQL 5.7 समतुल्य पैटर्न '[[:<:]]for' है। | |
| [[:कक्षा:]] | RSI चरित्र वर्ग यह वर्णों के एक नामित समूह से मेल खाता है: अक्षरों के लिए [[:alpha:]], खाली स्थान के लिए [[:space:]], विराम चिह्नों के लिए [[:punct:]], और बड़े अक्षरों के लिए [[:upper:]]। ध्यान दें कि डबल वर्ग कोष्ठक। | SELECT * FROM `movies` WHERE `title` REGEXP '^[[:alpha:][:space:]]+$'; यह उन सभी फिल्मों को दिखाता है जिनके शीर्षक में केवल अक्षर और रिक्त स्थान होते हैं। उदाहरण के लिए, फॉरगेटिंग सारा मार्शल, जबकि पाइरेट्स ऑफ द कैरिबियन 4 को अंक के कारण छोड़ दिया गया है। | |
बैकस्लैश (\) एस्केप कैरेक्टर है। क्योंकि MySQL यह पहले स्ट्रिंग को और फिर पैटर्न को पार्स करता है, एक लिटरल बैकस्लैश को REGEXP पैटर्न के अंदर डबल बैकस्लैश (\\) के रूप में लिखा जाना चाहिए।
⚠️ संस्करण संबंधी चेतावनी: MySQL 8.0.4 संस्करण में पुराने रेगुलर एक्सप्रेशन इंजन को ICU लाइब्रेरी से बदल दिया गया। इस संस्करण में [[:<:]] और [[:>:]] शब्द मार्कर हटा दिए गए, इसलिए पुराने दस्तावेज़ों से कॉपी किए गए पैटर्न "सिंटैक्स त्रुटि" के साथ विफल हो जाते हैं। MySQL 8.0. इसके बजाय \b का प्रयोग करें।
अब जबकि प्रत्येक मेटाकैरेक्टर को परिभाषित कर दिया गया है, तो एक वाजिब सवाल उठता है: REGEXP को सरल LIKE ऑपरेटर की जगह कब इस्तेमाल करना चाहिए?
REGEXP बनाम LIKE: आपको किसका उपयोग करना चाहिए?
दोनों ऑपरेटर पैटर्न के आधार पर पंक्तियों को फ़िल्टर करते हैं, लेकिन वे अलग-अलग समस्याओं का समाधान करते हैं। LIKE केवल दो प्रतीकों को समझता है, जबकि REGEXP ऊपर दिखाए गए संपूर्ण मेटाकैरेक्टर सेट को समझता है। इस क्षमता की एक कीमत है, इसलिए चुनाव पसंद के बजाय एक समझौता है।
| कसौटी | तरह | regexp |
|---|---|---|
| पैटर्न प्रतीक | % और _ केवल | Anchors, श्रेणियाँ, प्रत्यावर्तन, परिमाणक, वर्ण वर्ग |
| विशिष्ट उपयोग | उपसर्ग, प्रत्यय और "शामिल है" खोज | सत्यापन, एकाधिक विकल्प, स्थिति-जागरूक मिलान |
| सूचकांक उपयोग | यह तभी संभव है जब पैटर्न % से शुरू न हो। | कभी भी इंडेक्स का उपयोग नहीं करता |
| प्रतिलाभ की मात्रा | सही या गलत | 1 या 0, और NULL जब दोनों में से कोई भी ऑपरेंड NULL हो। |
सीधे मिलान के लिए LIKE चुनें, क्योंकि यह पढ़ने में आसान है और इसमें इंडेक्स का उपयोग भी किया जा सकता है। REGEXP तब चुनें जब एक ही पैटर्न को एक साथ कई नियमों को व्यक्त करना हो, जैसे कि "c या d से शुरू होता है और अंक पर समाप्त होता है"। बड़ी तालिकाओं में, पहले इंडेक्स की गई शर्त का उपयोग करके पंक्तियों को सीमित करें, फिर उस छोटे समूह पर REGEXP लागू करें।
MySQL 8.0 नियमित अभिव्यक्ति फ़ंक्शन
REGEXP ऑपरेटर केवल एक ही प्रश्न का उत्तर देता है: क्या मान पैटर्न से मेल खाता है? MySQL 8.0 में चार ऐसे फ़ंक्शन जोड़े गए हैं जो और भी आगे बढ़कर आपको लोकेशन ढूंढने और एक्सपोर्ट करने की सुविधा देते हैं।tract, और मिलान करने वाले टेक्स्ट को फिर से लिखें। प्रत्येक एक वैकल्पिक match_type तर्क स्वीकार करता है, जहाँ 'c' केस-संवेदनशील तुलना को बाध्य करता है और 'i' केस-असंवेदनशील तुलना को बाध्य करता है।
- REGEXP_LIKE(expr, pattern) जब मान पैटर्न से मेल खाता है तो यह 1 लौटाता है। यह REGEXP ऑपरेटर का फ़ंक्शन रूप है, और match_type तर्क केस संवेदनशीलता को स्पष्ट करता है।
- REGEXP_INSTR(expr, pattern) यह मिलान किए गए पहले अक्षर की स्थिति लौटाता है, या पैटर्न न मिलने पर 0 लौटाता है।
- REGEXP_SUBSTR(expr, pattern) यह मिलान करने वाला सबस्ट्रिंग लौटाता है, जो किसी लंबे टेक्स्ट मान से वर्ष, कोड या संख्या निकालने के लिए उपयोगी है।
- REGEXP_REPLACE(expr, pattern, replacement) यह मान लौटाता है जिसमें प्रत्येक मिलान को प्रतिस्थापित किया गया है, इसलिए यह अंदर के डेटा को साफ कर सकता है। SQL अपडेट क्वेरी.
SELECT title, REGEXP_SUBSTR(title, '[0-9]+') AS number_in_title FROM `movies` WHERE REGEXP_LIKE(title, '[0-9]');
उपरोक्त क्वेरी उन सभी फिल्मों के शीर्षक लौटाती है जिनमें अंक शामिल हैं, साथ ही वे अंक भी। MySQL 5.7 ये फ़ंक्शन अनुपलब्ध हैं, इसलिए REGEXP ऑपरेटर ही एकमात्र विकल्प बचा है।
