ToolDeck

آزمایش‌گر عبارات منظم

عبارات منظم را روی یک رشته آزمایش کنید و تمام تطابق‌ها را برجسته‌شده ببینید

یک مثال امتحان کنید

الگو

//g

رشته آزمایشی

به‌صورت محلی اجرا می‌شود · جای‌گذاری اسرار امن است

عبارت منظم چیست؟

عبارت منظم (regex یا regexp) دنباله‌ای از کاراکترها است که یک الگوی جستجو را تعریف می‌کند. آزمایش‌گرهای regex به شما امکان می‌دهند یک الگو بنویسید، آن را روی متن نمونه اجرا کنید و تمام تطابق‌ها را بلادرنگ برجسته‌شده ببینید. این مفهوم به کارهای ریاضیدان Stephen Kleene درباره زبان‌های منظم در دهه ۱۹۵۰ برمی‌گردد، و Ken Thompson اولین موتور regex را در ۱۹۶۸ درون ویرایشگر متن QED ساخت.

موتور regex یک الگو را از چپ به راست می‌خواند و کاراکترهای ورودی را هنگام تلاش برای تطابق مصرف می‌کند. وقتی یک تطابق جزئی شکست می‌خورد، از بازگشت به عقب (backtracking) استفاده می‌کند: موتور یک قدم به عقب برمی‌گردد و مسیرهای جایگزین در الگو را امتحان می‌کند. برخی موتورها (مانند RE2 که در Go استفاده می‌شود) با تبدیل الگوها به ماشین حالت متناهی قطعی (DFA) از بازگشت به عقب کاملاً اجتناب می‌کنند، که تطابق در زمان خطی را تضمین می‌کند اما از ویژگی‌هایی مانند ارجاعات پشتی پشتیبانی نمی‌کند.

نحو regex به‌صورت آزاد استانداردسازی شده است. PCRE (عبارات منظم سازگار با Perl) رایج‌ترین نوع است که توسط PHP، ماژول re پایتون و JavaScript با تفاوت‌های جزئی پشتیبانی می‌شود. POSIX نحوی محدودتر تعریف می‌کند که توسط grep و sed استفاده می‌شود. این تفاوت‌ها هنگام انتقال الگوها بین زبان‌ها اهمیت دارند: یک lookahead که در JavaScript کار می‌کند ممکن است در موتور RE2 مربوط به Go اصلاً کامپایل نشود.

چرا از آزمایش‌گر Regex آنلاین استفاده کنیم؟

نوشتن regex در یک فایل کد به معنای ذخیره، اجرا و بررسی خروجی هر بار که الگو را تنظیم می‌کنید است. یک آزمایش‌گر regex مبتنی بر مرورگر این حلقه بازخورد را به صفر می‌رساند: تایپ می‌کنید، تطابق‌ها را می‌بینید.

برجسته‌سازی تطابق بلادرنگ
هر ضربه کلید نتایج تطابق را فوری به‌روز می‌کند. می‌بینید کدام بخش‌های متن تطابق دارند، کدام گروه‌های گیرنده پر شده‌اند، و دقیقاً هر تطابق کجا شروع و تمام می‌شود. بدون چرخه کامپایل-اجرا-اشکال‌زدایی.
🔒
پردازش با اولویت حریم خصوصی
تطابق الگو در مرورگر شما با استفاده از موتور JavaScript RegExp اجرا می‌شود. هیچ متن یا الگویی به سرور ارسال نمی‌شود. این موضوع هنگام آزمایش روی فایل‌های گزارش، داده‌های مشتریان یا پاسخ‌های API که حاوی اطلاعات حساس هستند اهمیت دارد.
🔍
بررسی بصری تطابق‌ها
تطابق‌ها به‌صورت درون‌خطی با موقعیت‌هایشان و مقادیر گروه‌های گیرنده نمایش داده می‌شوند. دیدن بصری تطابق‌ها تشخیص خطاهای یک‌واحدی در quantifierها یا لنگرهای گمشده را آسان‌تر می‌کند.
🌐
بدون ورود به سیستم یا نصب
روی هر دستگاهی با مرورگر مدرن کار می‌کند. بدون حساب کاربری، بدون افزونه، بدون پلاگین IDE. صفحه را باز کنید، الگو و متن خود را وارد کنید و شروع به آزمایش کنید.

کاربردهای آزمایش‌گر Regex

اعتبارسنجی ورودی در سمت کاربر
الگوهایی برای فیلدهای ایمیل، شماره تلفن یا کارت اعتباری بسازید و تأیید کنید، پیش از اینکه آن‌ها را در ویژگی‌های pattern مربوط به HTML5 یا منطق اعتبارسنجی JavaScript جاسازی کنید.
تجزیه گزارش در سمت سرور
الگوهای regex بنویسید که زمان‌بندها، کدهای خطا یا آدرس‌های IP را از گزارش‌های برنامه استخراج کنند. روی نمونه‌های واقعی گزارش آزمایش کنید تا مطمئن شوید الگو گروه‌های درستی را می‌گیرد.
DevOps و زیرساخت
regex مورد استفاده در بلوک‌های location مربوط به Nginx، قوانین rewrite مربوط به Apache یا قوانین هشداردهی Prometheus را اشکال‌زدایی کنید. یک الگوی اشتباه در پیکربندی سرور می‌تواند مسیریابی را خراب کند یا هشدارها را کاملاً نادیده بگیرد.
QA و اتوماسیون آزمون
تأیید کنید که بدنه پاسخ‌ها یا خروجی HTML با الگوهای مورد انتظار در ادعاهای آزمون سرتاسری تطابق دارند. regex را اینجا پیش از اضافه کردن به مجموعه آزمون‌تان آزمایش کنید.
خطوط لوله استخراج داده
الگوهایی برای استخراج فیلدهای ساختاریافته از متن غیرساختاریافته نمونه‌سازی کنید: اسکرپ کردن قیمت محصولات، تجزیه موارد لبه‌ای CSV یا استخراج متادیتا از هدر ایمیل‌ها.
یادگیری عبارات منظم
با متاکاراکترها، quantifierها و گروه‌ها روی رشته‌های نمونه آزمایش کنید. بازخورد بصری فوری یادگیری نحو regex را نسبت به خواندن مستندات به‌تنهایی آسان‌تر می‌کند.

مرجع سریع نحو Regex

جدول زیر پرکاربردترین نشانه‌های regex را پوشش می‌دهد. اینها در JavaScript، Python، Go، PHP و اکثر موتورهای سازگار با PCRE کار می‌کنند. پسوندهای خاص هر زبان (مانند الگوهای شرطی Python یا گروه‌های نام‌گذاری‌شده JavaScript با نحو \k) در بخش نمونه‌های کد ذکر شده‌اند.

الگونامتوضیح
.Any characterMatches any single character except newline (unless s flag is set)
\dDigitMatches [0-9]
\wWord characterMatches [a-zA-Z0-9_]
\sWhitespaceMatches space, tab, newline, carriage return, form feed
\bWord boundaryMatches the position between a word character and a non-word character
^Start of string/lineMatches the start of the input; with m flag, matches start of each line
$End of string/lineMatches the end of the input; with m flag, matches end of each line
*Zero or moreMatches the preceding token 0 or more times (greedy)
+One or moreMatches the preceding token 1 or more times (greedy)
?OptionalMatches the preceding token 0 or 1 time
{n,m}Quantifier rangeMatches the preceding token between n and m times
()Capturing groupGroups tokens and captures the matched text for back-references
(?:)Non-capturing groupGroups tokens without capturing the matched text
(?=)Positive lookaheadMatches a position followed by the given pattern, without consuming it
(?<=)Positive lookbehindMatches a position preceded by the given pattern, without consuming it
[abc]Character classMatches any one of the characters inside the brackets
[^abc]Negated classMatches any character not inside the brackets
|AlternationMatches the expression before or after the pipe

توضیح پرچم‌های Regex

پرچم‌ها (که modifierها هم نامیده می‌شوند) نحوه پردازش الگو توسط موتور را تغییر می‌دهند. در JavaScript آن‌ها را بعد از اسلش پایانی اضافه می‌کنید: /pattern/gi. در Python آن‌ها را به‌عنوان آرگومان دوم ارسال می‌کنید: re.findall(pattern, text, re.IGNORECASE | re.MULTILINE). همه پرچم‌ها در هر زبانی در دسترس نیستند.

پرچمنامرفتار
gGlobalFind all matches, not just the first one
iCase-insensitiveLetters match both uppercase and lowercase
mMultiline^ and $ match start/end of each line, not just the whole string
sDot-all. matches newline characters as well
uUnicodeTreat the pattern and subject as a Unicode string; enables \u{FFFF} syntax
yStickyMatches only from the lastIndex position in the target string

نمونه‌های کد

نمونه‌های عملی regex در JavaScript، Python، Go و خط فرمان. هر نمونه ساختار الگو، استخراج تطابق و خروجی را نشان می‌دهد.

JavaScript
// Match all email addresses in a string
const text = 'Contact us at support@example.com or sales@example.com'
const emailRegex = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g

const matches = text.matchAll(emailRegex)
for (const match of matches) {
  console.log(match[0], 'at index', match.index)
}
// → "support@example.com" at index 14
// → "sales@example.com" at index 37

// Named capture groups (ES2018+)
const dateRegex = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/
const result = '2026-03-30'.match(dateRegex)
console.log(result.groups)
// → { year: "2026", month: "03", day: "30" }

// Replace with a callback
'hello world'.replace(/\b\w/g, c => c.toUpperCase())
// → "Hello World"
Python
import re

# Find all IPv4 addresses
text = 'Server 192.168.1.1 responded, fallback to 10.0.0.255'
pattern = r'\b(?:\d{1,3}\.){3}\d{1,3}\b'

matches = re.findall(pattern, text)
print(matches)  # → ['192.168.1.1', '10.0.0.255']

# Named groups and match objects
date_pattern = r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})'
m = re.search(date_pattern, 'Released on 2026-03-30')
if m:
    print(m.group('year'))   # → '2026'
    print(m.group('month'))  # → '03'

# Compile for repeated use (faster in loops)
compiled = re.compile(r'\b[A-Z][a-z]+\b')
words = compiled.findall('Hello World Foo bar')
print(words)  # → ['Hello', 'World', 'Foo']
Go
package main

import (
	"fmt"
	"regexp"
)

func main() {
	// Find all matches
	re := regexp.MustCompile(`\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}\b`)
	text := "Contact support@example.com or sales@example.com"
	matches := re.FindAllString(text, -1)
	fmt.Println(matches)
	// → [support@example.com sales@example.com]

	// Named capture groups
	dateRe := regexp.MustCompile(`(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})`)
	match := dateRe.FindStringSubmatch("2026-03-30")
	for i, name := range dateRe.SubexpNames() {
		if name != "" {
			fmt.Printf("%s: %s\n", name, match[i])
		}
	}
	// → year: 2026
	// → month: 03
	// → day: 30

	// Replace with a function
	result := re.ReplaceAllStringFunc(text, func(s string) string {
		return "[REDACTED]"
	})
	fmt.Println(result)
	// → Contact [REDACTED] or [REDACTED]
}
CLI (grep / sed)
# Find lines matching an IP address pattern
grep -E '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b' access.log

# Extract email addresses from a file
grep -oE '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' contacts.txt

# Replace dates from YYYY-MM-DD to DD/MM/YYYY using sed
echo "2026-03-30" | sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/'
# → 30/03/2026

# Count matches per file in a directory
grep -rcE 'TODO|FIXME|HACK' src/
# → src/main.js:3
# → src/utils.js:1

سؤالات متداول

تفاوت بین الگوهای regex و glob چیست؟
الگوهای glob (مانند *.txt یا src/**/*.js) نحوی ساده‌شده برای عبارت جایگزین هستند که برای تطابق مسیر فایل در شل‌ها و ابزارهای ساخت استفاده می‌شوند. از * (هر کاراکتری)، ? (یک کاراکتر) و [] (کلاس‌های کاراکتر) پشتیبانی می‌کنند اما فاقد quantifierها، گروه‌ها، lookaheadها و alternation هستند. Regex بسیار گویاتر است و روی متن دلخواه کار می‌کند، نه فقط مسیرهای فایل. الگوی glob *.json تقریباً معادل regex ^.*\.json$ است.
چطور می‌توانم یک نقطه یا براکت واقعی را در regex تطابق دهم؟
کاراکتر را با یک بک‌اسلش پیشوند کنید: \. یک نقطه واقعی را تطابق می‌دهد، \[ یک براکت واقعی را تطابق می‌دهد. داخل کلاس کاراکتر []، نقطه از قبل واقعی است و نیازی به escape ندارد. یک اشتباه رایج نوشتن 192.168.1.1 بدون escape دادن نقطه‌هاست که با 192x168y1z1 هم تطابق می‌دهد زیرا . به معنای «هر کاراکتری» است.
آیا داده‌های آزمایشی من به سرور ارسال می‌شوند؟
خیر. این ابزار تطابق regex را کاملاً در مرورگر شما با استفاده از موتور JavaScript RegExp اجرا می‌کند. هیچ درخواست شبکه‌ای با متن یا الگوی شما انجام نمی‌شود. می‌توانید این را با باز کردن تب Network در DevTools مرورگر هنگام استفاده از ابزار تأیید کنید.
چرا regex من در JavaScript کار می‌کند اما در Python شکست می‌خورد؟
JavaScript و Python از موتورهای regex متفاوتی با مجموعه قابلیت‌های کمی متفاوت استفاده می‌کنند. JavaScript از \d، lookaheadهای (?=) و lookbehindهای (?<=) از ES2018 به بعد پشتیبانی می‌کند، اما از الگوهای شرطی، گروه‌های اتمی یا quantifierهای possessive پشتیبانی نمی‌کند. ماژول re پایتون از کلاس‌های ویژگی Unicode مانند \p{Lu} پشتیبانی نمی‌کند (به‌جای آن از ماژول regex شخص ثالث استفاده کنید). همیشه در موتور زبان هدف آزمایش کنید یا مستندات regex آن زبان را مطالعه کنید.
چه چیزی باعث بازگشت به عقب فاجعه‌آمیز در regex می‌شود؟
بازگشت به عقب فاجعه‌آمیز زمانی رخ می‌دهد که یک الگو دارای quantifierهای تودرتو باشد که تعداد نمایی از مسیرهای تطابق ایجاد می‌کنند. مثال کلاسیک (a+)+ است که روی رشته‌ای از a‌ها به دنبال یک کاراکتر غیرتطابق اعمال می‌شود. موتور هر روش ممکنی برای تقسیم a‌ها بین گروه‌های داخلی و خارجی را قبل از شکست امتحان می‌کند. برای رفع این مشکل از گروه‌های اتمی (?>)، quantifierهای possessive مانند a++ استفاده کنید، یا الگو را برای اجتناب از تکرار مبهم بازنویسی کنید.
آیا می‌توانم از regex برای تجزیه HTML استفاده کنم؟
Regex می‌تواند مقادیر ساده را از قطعه‌های HTML استخراج کند، مثلاً گرفتن href از یک تگ <a> تنها. برای تجزیه کامل HTML، از یک تجزیه‌گر مناسب استفاده کنید (DOMParser در JavaScript، BeautifulSoup در Python، یا html/template در Go). HTML یک گرامر عاری از زمینه است، و regex گرامرهای منظم را پردازش می‌کند. تگ‌های تودرتو، ویژگی‌های اختیاری و عناصر self-closing الگوهایی ایجاد می‌کنند که regex نمی‌تواند به‌طور قابل اطمینانی با آن‌ها تطابق دهد.
تفاوت بین quantifierهای greedy و lazy چیست؟
یک quantifier greedy (* یا +) تا حد امکان کاراکترهای بیشتری را تطابق می‌دهد، سپس اگر بقیه الگو شکست بخورد به عقب برمی‌گردد. یک quantifier lazy (*? یا +?) تا حد امکان کاراکترهای کمتری را تطابق می‌دهد و فقط در صورت نیاز گسترش می‌یابد. برای ورودی <b>one</b><b>two</b>، الگوی greedy یعنی <b>.*</b> کل رشته را از اولین <b> تا آخرین </b> تطابق می‌دهد، در حالی که الگوی lazy یعنی <b>.*?</b> به‌طور جداگانه <b>one</b> و <b>two</b> را تطابق می‌دهد.