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)
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औरhttpsmatch करता है -
(?: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 के।
दिनांक और समय
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)
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 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 में नहीं फैलेगा।