हर डेवलपर के लिए जरूरी Regex Patterns जो आपको बुकमार्क करने चाहिए

सामान्य regex पैटर्न संदर्भ जिसमें डार्क एडिटर बैकग्राउंड पर पैटर्न मैचिंग सिंटैक्स हाइलाइट किया गया है

Regex patterns ऐसे reusable templates होते हैं जो text के अंदर characters की specific sequences को match करते हैं - इन्हें एक super-powered "find" tool समझें जो लगभग हर programming language में काम करता है। चाहे आप email address validate कर रहे हों, form से phone number निकाल रहे हों, या log file parse कर रहे हों - कुछ well-chosen regular expressions आपकी 90% जरूरतें पूरी कर देते हैं। इस guide में सबसे practical patterns एकत्र किए गए हैं, हर एक को विस्तार से समझाया गया है, और यह भी बताया गया है कि इन्हें अपनी जरूरत के हिसाब से कैसे बदलें।

Regex Syntax की त्वरित समीक्षा

Patterns में जाने से पहले, यहाँ उन building blocks की एक cheat-sheet दी गई है जो बार-बार दिखेंगे। भले ही आपने पहले regex इस्तेमाल किया हो, इन्हें एक जगह देखना हमेशा काम आता है।

Token अर्थ उदाहरण match
. नई पंक्ति को छोड़कर कोई भी character a.c matches abc , a1c
\d कोई भी अंक (0-9) \d\d matches 42
\w Word character (अक्षर, अंक, underscore) \w+ matches hello_world
\s Whitespace (space, tab, नई पंक्ति) \s+ कई spaces match करता है
^ / $ String का आरंभ / अंत ^\d+$ केवल 123 match करता है
{n,m} n से m बार दोहराव \d{2,4} matches 12 से 1234
[abc] Character class - a, b, c में से कोई एक [aeiou] कोई भी स्वर match करता है
(?:...) Non-capturing group backreference store किए बिना group बनाता है
(?=...) Positive lookahead आगे क्या है यह जांचता है, consume किए बिना

MDN Web Docs regular expressions guide JavaScript regex syntax के लिए सबसे अच्छा single reference है, और नीचे दिए गए अधिकांश patterns Python, PHP, Java और Ruby में भी सीधे काम करते हैं - बस कुछ flag अंतरों के साथ।

Email Validation

Email regex का सबसे classic उपयोग है - और साथ ही वह जगह भी जहाँ अधिकांश developers बहुत ज्यादा strict होने की कोशिश में गलती करते हैं। RFC 5322 spec तकनीकी रूप से "very unusual"@example.com जैसे addresses की अनुमति देता है, जिन्हें लगभग कोई भी regex handle नहीं कर पाता। 99% real-world input validation के लिए यह practical pattern इस्तेमाल करें:

^[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}$

हर हिस्से का काम:

  • [a-zA-Z0-9._%+\-]+ - local part (@ से पहले); dots, plus signs, hyphens, underscores की अनुमति देता है
  • @ - literal at sign
  • [a-zA-Z0-9.\-]+ - domain name, subdomains सहित
  • \.[a-zA-Z]{2,} - कम से कम 2 characters का TLD (.io, .com, .museum)
Regex अकेले यह confirm नहीं कर सकता कि email address वास्तव में मौजूद है या उस पर mail deliver होगी। जो भी जरूरी हो उसके लिए हमेशा confirmation email भेजें।

URL और वेब पते

URL pattern matching में plain text से links निकालना और user द्वारा दिए गए website field को validate करना - दोनों शामिल हैं।

https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_+.~#?&\/=]*)
  • https? - दोनों http और https match करता है
  • (?:www\.)? - optional www prefix
  • [-a-zA-Z0-9@:%._+~#=]{1,256} - hostname characters, अधिकतम 256 chars
  • \.[a-zA-Z0-9()]{1,6} - TLD
  • \b(?:[-a-zA-Z0-9()@:%_+.~#?&\/=]*) - optional path, query string और fragment

अगर आपको केवल validate करना है (extract नहीं), तो इसे ^ और $ anchors से wrap करें।

फोन नंबर

फोन नंबर काफी अव्यवस्थित होते हैं क्योंकि formatting देश और user की आदत के हिसाब से बहुत अलग होती है। दो patterns अधिकांश scenarios को cover करते हैं:

US/Canada (NANP) format

^(\+1[-.\s]?)?(\(?\d{3}\)?[-.\s]?)?\d{3}[-.\s]?\d{4}$

इन्हें match करता है: 555-867-5309 , (555) 867 5309 , +1.555.867.5309 , 5558675309

International (E.164 format)

^\+[1-9]\d{6,14}$

E.164 वह format है जो अधिकांश telephony APIs (Twilio, AWS SNS) उपयोग करते हैं। यह + और country code से शुरू होता है, बिना किसी space या punctuation के।

बुनियादी format-checking से आगे - जैसे यह verify करना कि कोई नंबर किसी specific देश में valid mobile line है - के लिए एक dedicated library जैसे libphonenumber (Google की open-source phone number library, Java, JavaScript, Python और अन्य में उपलब्ध) इस्तेमाल करें।

दिनांक और समय

Date pattern matching log parsers, form validators और data pipelines में आम है। आप जो format target करते हैं वह आपके input source पर निर्भर करता है।

ISO 8601 (YYYY-MM-DD)

^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$

US format (MM/DD/YYYY)

^(0[1-9]|1[0-2])\/(0[1-9]|[12]\d|3[01])\/\d{4}$

24-घंटे का समय (HH:MM या HH:MM:SS)

^([01]\d|2[0-3]):([0-5]\d)(?::([0-5]\d))?$

ध्यान रखें कि ये patterns केवल format validate करते हैं, calendar logic नहीं। ये 2024-02-31 (February 31 जो होता ही नहीं) को भी accept कर लेंगे। सटीक date validation के लिए, regex check के बाद अपनी language की date library से parse करें।

Password की मजबूती जांचना

Password नियमों में आमतौर पर character types का mix और minimum length जरूरी होती है। Lookaheads की मदद से यह काम बिना अलग-अलग checks के साफ-सुथरे तरीके से होता है।

कम से कम 8 characters, एक uppercase, एक lowercase, एक अंक

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$

मजबूत password: 8+ characters, uppercase, lowercase, अंक और special character

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]).{8,}$

हर (?=.*[...]) एक lookahead है जो पूरी string में कम से कम एक matching character खोजता है। अंत में .{8,} minimum length enforce करता है। आप {8,} को {12,} से बदल सकते हैं ताकि 12-character minimum enforce हो, जो NIST SP 800-63B दिशानिर्देशों के अनुरूप है।

IP Addresses

IPv4

^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$

यह 999.0.0.1 जैसी values को सही तरीके से reject करता है क्योंकि हर octet को 0-255 की range में explicitly match किया जाता है।

IPv6 (सरलीकृत)

^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$

यह पूरे 8-group format को handle करता है। Compressed notation (जैसे loopback के लिए ::1 ) के लिए pattern काफी जटिल हो जाता है - उस स्थिति में regex से ज्यादा भरोसेमंद है कि किसी network library से parse किया जाए।

HTML और Markup

यहाँ कुछ targeted patterns वाकई उपयोगी हैं। "पूरे documents के लिए HTML को regex से parse न करें" की सामान्य सलाह अभी भी लागू होती है - उसके लिए BeautifulSoup या DOMParser जैसे proper DOM parser इस्तेमाल करें। लेकिन specific और सीमित कामों के लिए regex ठीक काम करता है।

सभी HTML tags हटाएं

<[^>]*>

किसी specific tag से content निकालें (जैसे <title>)

([^<]*)<\/title>

Capture group 1 में title का text होगा।

HTML hex color codes match करें

#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})\b

3-digit shorthand ( #fff ) और 6-digit full form ( #ffffff ) दोनों match करता है।

रोजमर्रा के उपयोगी Patterns

ये patterns विभिन्न प्रकार के projects में बार-बार काम आते हैं।

Slug (URL-friendly string)

^[a-z0-9]+(?:-[a-z0-9]+)*$

my-blog-post-2024 जैसी strings match करता है। कोई uppercase नहीं, शुरू या अंत में hyphen नहीं, double hyphen नहीं।

क्रेडिट कार्ड नंबर (बुनियादी format, बिना spaces के)

^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|6(?:011|5[0-9]{2})[0-9]{12})$
  • 4 से शुरू - Visa (13 या 16 digits)
  • 51-55 से शुरू - Mastercard (16 digits)
  • 34 या 37 से शुरू - Amex (15 digits)
  • 6011 या 65 से शुरू - Discover (16 digits)
कभी भी raw card numbers store न करें। यह pattern केवल client-side format feedback के लिए है। असली card validation किसी PCI-compliant processor जैसे Stripe या Braintree से ही होनी चाहिए।

Whitespace normalization (कई spaces को एक में बदलें)

\s{2,}

Matches को single space से replace करें ताकि user के messy input या scraped text को साफ किया जा सके।

केवल अंक

^\d+$

केवल alphanumeric

^[a-zA-Z0-9]+$

किसी word वाली line match करें (flag के साथ case-insensitive)

^.*\bword\b.*$

\b word boundary यह सुनिश्चित करता है कि password के अंदर word match न हो।

Version numbers निकालें (semver)

\bv?(\d+)\.(\d+)\.(\d+)(?:-([a-zA-Z0-9.]+))?(?:\+([a-zA-Z0-9.]+))?\b

v2.14.0-beta.1+build.42 जैसी strings से major, minor, patch, pre-release label और build metadata capture करता है।

Flags और व्यावहारिक सुझाव

Regex patterns का व्यवहार आप जो flags लगाते हैं उस पर निर्भर करता है। सबसे ज्यादा जरूरी flags:

Flag JS Python प्रभाव
Case-insensitive i re.IGNORECASE uppercase और lowercase को समान मानता है
Global (सभी खोजें) g re.findall() केवल पहला नहीं, सभी matches लौटाता है
Multiline m re.MULTILINE ^ और $ पूरी string की बजाय हर line की boundary से match करते हैं
Dotall s re.DOTALL . newline characters को भी match करता है

कुछ आदतें जो आपका debugging समय बचाएंगी:

  • हमेशा edge cases से test करें - खाली string, maximum length, Unicode characters, और ऐसी strings जो लगभग valid लगती हों लेकिन हों नहीं।
  • Non-capturing groups (?:...) इस्तेमाल करें जब matched content की जरूरत न हो - यह capturing groups से तेज और साफ होता है।
  • Validation patterns को anchor करें ^ और $ से, ताकि किसी invalid string के अंदर valid-looking substring slip न हो जाए।
  • Catastrophic backtracking से सावधान रहें - nested quantifiers जैसे (a+)+ crafted input पर regex engine को रोक सकते हैं। Quantifiers को simple और specific रखें।
  • Patterns बनाते समय regex tester इस्तेमाल करें। regex101.com live match breakdown दिखाता है, हर token समझाता है, और PCRE, JavaScript, Python तथा अन्य flavors के बीच switch करने देता है।
Regex pattern matching और input validation tools

अनुमान लगाए बिना regex patterns test और validate करें

Input validation के लिए reliable regex patterns बनाना तब आसान हो जाता है जब सही tools हाथ में हों। Regex patterns और अन्य तरीकों से text को साफ करने, जांचने और बदलने के लिए हमारे मुफ्त developer utilities देखें।

हमारे मुफ्त Tools आजमाएं →

Greedy quantifiers (जैसे .* ) जितना हो सके उतना match करते हैं और फिर backtrack करते हैं। Lazy quantifiers (जैसे .*? ) जितना कम हो सके उतना match करते हैं। उदाहरण के लिए, bold string के खिलाफ, <.*> pattern पूरी string match करता है, जबकि <.*?> केवल match करता है। Delimiters के बीच content निकालते समय lazy quantifiers इस्तेमाल करें।

ज्यादातर हाँ, लेकिन कुछ अंतर हैं। Python का re module PCRE-style syntax इस्तेमाल करता है और (?P...) के साथ named groups support करता है। JavaScript थोड़ा अलग flag syntax इस्तेमाल करता है और पुराने engines (ES2018 से पहले) में lookbehinds support नहीं होते। Cross-language काम के लिए common subset पर टिकें: character classes, quantifiers, anchors और basic groups।

Format validation के लिए production में regex बिल्कुल ठीक है - यह लगभग हर web framework में इस्तेमाल होता है। जोखिम तब होता है जब poorly written patterns catastrophic backtracking के जरिए ReDoS (regex denial-of-service) attacks की अनुमति दें। Nested quantifiers से बचें, patterns को specific रखें, और regex चलाने से पहले हमेशा reasonable input length limit लगाएं।

ASCII input के लिए अधिकांश common engines में दोनों समान हैं। अंतर Unicode के साथ आता है: \d कुछ engines में (जैसे Unicode mode के साथ Python 3) अन्य scripts के अंक भी match करता है, जैसे Arabic-Indic numerals। अगर आप strictly ASCII digits 0-9 चाहते हैं तो स्पष्टता के लिए [0-9] इस्तेमाल करें। अधिकांश web form validation के लिए यह अंतर मायने नहीं रखता।

आपको दो चीजें चाहिए: dotall flag (ताकि . newlines भी match करे) और संभवतः multiline flag (ताकि ^ और $ पूरी string की बजाय हर line से anchor हों)। JavaScript में /pattern/ms इस्तेमाल करें। Python में re.DOTALL | re.MULTILINE combine करें। Dotall के बिना, . line breaks पर रुक जाता है और आपका pattern lines में नहीं फैलेगा।