ToolDeck

مختبر التعبيرات النمطية

اختبر التعبيرات النمطية على نص وشاهد جميع التطابقات مُبرَّزة

جرب مثالاً

النمط

//g

نص الاختبار

يعمل محليًا · آمن للصق الأسرار

ما هو التعبير النمطي (Regex)؟

التعبير النمطي (regex أو regexp) هو تسلسل من الأحرف يُعرّف نمط بحث. تتيح لك أدوات اختبار regex كتابة نمط وتشغيله على نص تجريبي ورؤية جميع التطابقات مُبرَّزة في الوقت الفعلي. يعود مفهوم التعبيرات النمطية إلى أعمال الرياضي ستيفن كليني في اللغات النمطية خلال الخمسينيات، ثم بنى كين تومبسون أول محرك regex ضمن محرر النصوص QED عام 1968.

يقرأ محرك regex النمطَ من اليسار إلى اليمين، مستهلكًا أحرف المدخلات في محاولة للمطابقة. يستخدم التراجع (backtracking) حين تفشل مطابقة جزئية: يتراجع المحرك ويجرب مسارات بديلة في النمط. بعض المحركات، كـRE2 المستخدم في Go، تتجنب التراجع كليًا عبر تحويل الأنماط إلى آلات حالة محدودة (DFA)، مما يضمن مطابقة خطية الزمن على حساب دعم ميزات كالمراجع الخلفية (back-references).

صياغة regex غير موحدة بالكامل. PCRE (Perl Compatible Regular Expressions) هي النكهة الأكثر شيوعًا، يدعمها PHP ووحدة re في Python وJavaScript مع اختلافات طفيفة. تُعرّف POSIX صياغة أكثر محدودية تستخدمها grep وsed. تبرز هذه الفروق عند نقل الأنماط بين اللغات: فـlookahead يعمل في JavaScript قد لا يُترجَم في محرك RE2 الخاص بـGo.

لماذا تستخدم مختبر regex عبر الإنترنت؟

كتابة regex داخل ملف برمجي تعني الحفظ والتشغيل وفحص الإخراج في كل مرة تعدّل فيها النمط. أداة regex في المتصفح تختصر هذه الحلقة فورًا: تكتب وترى التطابقات.

تبرز التطابقات في الوقت الفعلي
كل ضغطة مفتاح تُحدّث نتائج التطابق على الفور. ترى أي أجزاء من النص تتطابق، وأي مجموعات التقاط مملوءة، والموضع الدقيق الذي يبدأ فيه كل تطابق وينتهي. بلا دورة تجميع-تشغيل-تصحيح.
🔒
المعالجة تتم على جهازك
تعمل مطابقة الأنماط في متصفحك باستخدام محرك JavaScript RegExp. لا يُرسَل أي نص أو نمط إلى خادم. هذا مهم عند الاختبار على ملفات سجلات أو بيانات العملاء أو استجابات API التي تحتوي على معلومات حساسة.
🔍
فحص بصري للتطابقات
تُبرز التطابقات في النص مباشرةً مع عرض مواضعها وقيم مجموعات الالتقاط. الرؤية البصرية للتطابقات تُسهّل اكتشاف أخطاء المحددات الكمية أو الارتساءات المفقودة.
🌐
بدون تسجيل أو تثبيت
تعمل على أي جهاز مزوّد بمتصفح حديث. لا حساب، ولا إضافات، ولا ملحقات IDE. افتح الصفحة، الصق نمطك ونصك، وابدأ الاختبار.

حالات استخدام مختبر regex

التحقق من مدخلات الواجهة الأمامية
أنشئ أنماطًا وتحقق منها لحقول البريد الإلكتروني وأرقام الهاتف وبطاقات الائتمان قبل إضافتها إلى خاصية pattern في HTML5 أو منطق التحقق بـJavaScript.
تحليل سجلات الواجهة الخلفية
اكتب أنماط regex تستخرج الطوابع الزمنية أو رموز الأخطاء أو عناوين IP من سجلات التطبيقات. اختبر على عينات سجلات حقيقية للتأكد من أن النمط يلتقط المجموعات الصحيحة.
DevOps والبنية التحتية
صحّح أنماط regex المستخدمة في كتل location في Nginx أو قواعد إعادة الكتابة في Apache أو قواعد تنبيه Prometheus. نمط خاطئ في إعداد الخادم قد يُعطّل التوجيه أو يُفوّت التنبيهات بالكامل.
ضمان الجودة وأتمتة الاختبار
تحقق من أن هيئات الاستجابات أو إخراج HTML تتطابق مع الأنماط المتوقعة في تأكيدات الاختبار الشامل. اختبر regex هنا قبل إضافتها إلى مجموعة الاختبارات.
خطوط أنابيب استخراج البيانات
أنشئ نماذج أولية لأنماط تستخرج حقولًا منظمة من نصوص غير منظمة: استخلاص أسعار المنتجات، أو تحليل الحالات الاستثنائية في CSV، أو سحب البيانات الوصفية من ترويسات البريد الإلكتروني.
تعلم التعبيرات النمطية
جرّب الأحرف الخاصة والمحددات الكمية والمجموعات على نصوص تجريبية. التغذية الراجعة البصرية الفورية تجعل تعلم صياغة 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

الأعلام (تُسمى أيضًا المعدِّلات) تُغيّر طريقة معالجة المحرك للنمط. في 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) هي صياغة بدل مبسّطة تُستخدم لمطابقة مسارات الملفات في الأصداف وأدوات البناء. تدعم * (أي أحرف) و? (حرف واحد) و[] (فئات أحرف)، لكنها تفتقر إلى المحددات الكمية والمجموعات والـlookaheads والتفريع. regex أكثر تعبيرًا بكثير وتعمل على نصوص عشوائية لا مسارات الملفات فحسب. نمط glob ‎*.json يعادل تقريبًا regex ‎^.*\.json$.
كيف أطابق نقطة حرفية أو قوسًا في regex؟
ضع شرطة مائلة عكسية قبل الحرف: ‎\. تطابق نقطة حرفية، و‎\[ يطابق قوسًا حرفيًا. داخل فئة الأحرف []، النقطة حرفية بالفعل ولا تحتاج إلى تهريب. خطأ شائع هو كتابة 192.168.1.1 دون تهريب النقاط، مما يُطابق 192x168y1z1 لأن . تعني "أي حرف".
هل تُرسَل بياناتي الاختبارية إلى خادم؟
لا. تُنفّذ هذه الأداة مطابقة regex بالكامل في متصفحك باستخدام محرك JavaScript RegExp. لا تُرسَل أي طلبات شبكة تحمل نصك أو نمطك. يمكنك التأكد من ذلك بفتح علامة تبويب Network في أدوات مطوري المتصفح أثناء استخدام الأداة.
لماذا يعمل نمط regex في JavaScript لكنه يفشل في Python؟
يستخدم JavaScript وPython محركات regex مختلفة بمجموعات ميزات متباينة. يدعم JavaScript ‎\d والـlookaheads (?=) والـlookbehinds (?<=) منذ ES2018، لكنه لا يدعم الأنماط الشرطية أو المجموعات الذرية أو المحددات الكمية الامتلاكية. وحدة re في Python لا تدعم فئات الخصائص ‎\p{} لـUnicode (استخدم وحدة regex الخارجية بدلًا من ذلك). اختبر دائمًا بمحرك اللغة المستهدفة أو راجع توثيق regex الخاص بها.
ما الذي يُسبب التراجع الكارثي في regex؟
يحدث التراجع الكارثي حين يحتوي النمط على محددات كمية متداخلة تُنشئ عددًا هائلًا من مسارات المطابقة. المثال الكلاسيكي هو (a+)+ على سلسلة من أحرف a يتبعها حرف لا يتطابق. يجرّب المحرك كل طريقة ممكنة لتوزيع أحرف a بين المجموعتين الداخلية والخارجية قبل الفشل. لإصلاح ذلك: استخدم المجموعات الذرية (?>) أو المحددات الكمية الامتلاكية a++ أو أعد كتابة النمط لتجنب التكرار الغامض.
هل يمكنني استخدام regex لتحليل HTML؟
يمكن لـregex استخراج قيم بسيطة من أجزاء HTML، كسحب href من وسم <a> واحد. للتحليل الكامل لـHTML، استخدم مُحلّلًا مناسبًا (DOMParser في JavaScript، أو BeautifulSoup في Python، أو html/template في Go). HTML نحو خالٍ من السياق، بينما تتعامل regex مع النحو النمطي. الوسوم المتداخلة والسمات الاختيارية والعناصر ذاتية الإغلاق تُنشئ أنماطًا لا تستطيع regex مطابقتها بموثوقية.
ما الفرق بين المحددات الكمية الجشعة والكسولة؟
المحدد الكمي الجشع (* أو +) يطابق أكبر عدد ممكن من الأحرف ثم يتراجع إن فشل بقية النمط. أما المحدد الكمي الكسول (*? أو +?) فيطابق أقل عدد ممكن من الأحرف ويتوسع عند الحاجة فقط. للمدخل <b>واحد</b><b>اثنان</b>، يطابق النمط الجشع <b>.*</b> السلسلة كاملةً من أول <b> إلى آخر </b>، بينما يطابق النمط الكسول <b>.*?</b> العنصر <b>واحد</b> والعنصر <b>اثنان</b> كلًا على حدة.