اگر تا به حال برایتان پیش آمده که یک کد رجکس (Regex) را با کلی زحمت در ابزارهای آنلاین مثل Regex101 تست کنید و عالی جواب بگیرید، اما همان کد در گوگل سرچ کنسول (GSC) یا آنالیتیکس (GA4) به درستی کار نکند، باید بگویم که شما تنها نیستید. این یکی از رایجترین چالشهایی است که ما متخصصان سئو و تحلیلگران داده با آن درگیریم.
مشکل از دانش شما نیست؛ مشکل از تفاوت سینتکس است. گوگل در ابزارهای خود (از GSC و GA4 گرفته تا گوگل شیتس و لوکر استودیو) از موتور رایج و قدرتمند PCRE استفاده نمیکند، بلکه موتور اختصاصی، سریعتر و امنتر خودش یعنی RE2 را به کار میبرد.
درک تفاوتهای این دو موتور، کلید حل این مشکل و استفاده حرفهای از فیلترها در اکوسیستم گوگل است. اگر با خود عبارات باقاعده آشنایی ندارید، پیشنهاد میکنم ابتدا نگاهی به مبانی و مفاهیم پایه رجکسبیندازید. اما اگر مستقیماً برای حل مشکلتان در GSC اینجا هستید، در این راهنما به صورت فنی و کاملاً عملی، دقیقاً به همین موضوع میپردازیم و یک بار برای همیشه این چالش را حل میکنیم.
جدول مقایسه سریع: چرا رجکس شما در سرچ کنسول کار نمیکند؟ (RE2 در برابر PCRE)
| ویژگی (Feature) | RE2 (موتور گوگل) | PCRE (موتور رایج در Regex101) |
|---|---|---|
| هدف اصلی | سرعت و امنیت (جلوگیری از حملات ReDoS) | قدرت و انعطافپذیری (قابلیتهای پیچیده) |
| الگوریتم پردازش | مبتنی بر ماشین (Automata) – زمان پردازش خطی | بازگشت به عقب (Backtracking) – زمان پردازش نمایی (مستعد خطر) |
| مهمترین تفاوت | از Lookaround ها (Lookahead/Lookbehind) پشتیبانی نمیکند () | از Lookaround ها به طور کامل پشتیبانی میکند () |
| کجا استفاده میشود؟ | سرچ کنسول، آنالیتیکس، لوکر استودیو، گوگل شیتس | PHP، Python (کتابخانه re)، جاوا اسکریپت (پیشرفته)، اکثر ابزارهای تست آنلاین |
ویژگی (Feature)
RE2 (موتور گوگل)
PCRE (موتور رایج در Regex101)
هدف اصلی
سرعت و امنیت (جلوگیری از حملاتReDoS)
قدرت و انعطافپذیری (قابلیتهای پیچیده)
الگوریتم پردازش
مبتنی بر ماشین (Automata) – زمان پردازش خطی
بازگشت به عقب (Backtracking) – زمان پردازش نمایی (مستعد خطر)
مهمترین تفاوت
ازLookaroundها (Lookahead/Lookbehind) پشتیبانی نمیکند ()
ازLookaroundها به طور کامل پشتیبانی میکند ()
کجا استفاده میشود؟
سرچ کنسول، آنالیتیکس، لوکر استودیو، گوگل شیتس
PHP، Python (کتابخانهre)، جاوا اسکریپت (پیشرفته)، اکثر ابزارهای تست آنلاین
سینتکس RE2 چیست و چرا گوگل آن را به PCRE ترجیح میدهد؟
تعریف RE2: عبارات باقاعده (Regex) به سبک گوگل
اجازه بده بحث را ساده شروع کنیم. RE2 (Regular Expression 2) در واقع موتور اختصاصی گوگل برای پردازش عبارات باقاعده (Regex) است.
وقتی تو و من در ابزارهایی مثل گوگل سرچ کنسول (GSC) یا گوگل آنالیتیکس (GA) از رجکس برای فیلتر کردن URLها یا دادهها استفاده میکنیم، در واقع در حال استفاده از سینتکس RE2 هستیم، نه لزوماً سینتکس رایجتری مثل PCRE (که در ادامه میگویم چیست).
RE2 زبان برنامهنویسی نیست، بلکه یک کتابخانه (Library) است که گوگل آن را توسعه داده تا بتواند رجکسها را با سرعت و امنیت بسیار بالا پردازش کند.
تفاوت الگوریتم RE2 با PCRE: تمرکز بر سرعت و امنیت
اینجا دقیقاً جایی است که تفاوت اصلی مشخص میشود و دلیل تمام سردرگمیها هم همینجاست.
PCRE (Perl Compatible Regular Expressions):
این همان استاندارد رایجی است که اکثر ما (مخصوصاً توسعهدهندگان) با آن رجکس را یاد گرفتهایم. ابزارهای آنلاینی مثل Regex101 هم معمولاً به صورت پیشفرض از این موتور استفاده میکنند.
PCRE از الگوریتمی به نام Backtracking (بازگشت به عقب) استفاده میکند. این الگوریتم بسیار قدرتمند و انعطافپذیر است و اجازه میدهد کارهای خیلی پیچیدهای مثل Lookaheads، Lookbehinds و Backreferences را اجرا کنیم.
نقطه ضعف بزرگ: همین قدرت، پاشنه آشیل آن است. Backtracking میتواند در الگوهای پیچیده یا روی متنهای خاص، به شدت کند شود و به صورت نمایی (Exponential) منابع سیستم (CPU) را مصرف کند.
RE2 (موتور گوگل):
RE2 از الگوریتم متفاوتی استفاده میکند که مبتنی بر Automata Theory (نظریه ماشینها) است.
مزیت بزرگ: این الگوریتم تضمین میکند که زمان پردازش رجکس، همیشه به صورت خطی ($O(n)$) باقی بماند؛ یعنی متناسب با طول متن ورودی است، نه پیچیدگی الگو.
محدودیت (Trade-off): برای رسیدن به این سرعت و پایداری تضمینشده، RE2 مجبور شده برخی از قابلیتهای پیچیده PCRE (دقیقاً همانهایی که باعث Backtracking میشوند، مثل Lookbehind) را پشتیبانی نکند.
تجربه عملی: اگر تا به حال یک کد رجکس را در Regex101 تست کردهای و عالی جواب داده، اما وقتی همان را در سرچ کنسول کپی کردهای، با خطا مواجه شده یا اصلاً کار نکرده، دلیلش دقیقاً همین تفاوت است. تو داشتی با PCRE تست میکردی، اما سرچ کنسول منتظر سینتکس RE2 بوده.
چرا گوگل از RE2 استفاده میکند؟ (جلوگیری از حملات ReDoS)
دلیل اصلی ترجیح گوگل، امنیت و پایداری در مقیاس تریلیونی است.
مشکلی که در الگوریتم Backtracking (موتور PCRE) وجود دارد، به یک آسیبپذیری امنیتی جدی به نام ReDoS (Regular Expression Denial of Service) منجر میشود.
ReDoSچطور کار میکند؟
یک مهاجم، الگوی رجکس بسیار پیچیده و بدی (که به آن Evil Regex هم میگویند) طراحی میکند.
این الگو را به عنوان ورودی به سیستمی میدهد که از موتور PCRE استفاده میکند (مثلاً یک فیلد جستجو در وبسایت).
موتور PCRE هنگام پردازش این الگوی بد، در چرخه “بازگشت به عقب” گیر میکند و تمام منابع CPU سرور را اشغال میکند (CPU 100%).
در نتیجه، سرور قفل میکند و از دسترس خارج میشود (Denial of Service).
حالا تصور کن گوگل بخواهد در ابزاری مثل سرچ کنسول یا آنالیتیکس که میلیونها کاربر همزمان در حال اجرای فیلترهای رجکس روی میلیاردها رکورد داده هستند، از PCRE استفاده کند! یک فیلتر اشتباه (یا مخرب) میتواند بخشی از منابع پردازشی گوگل را از کار بیندازد.
راهحل گوگل: استفاده از RE2.
موتور RE2 به دلیل ساختار الگوریتمیاش، ذاتاً در برابر حملات ReDoS مصون است. هیچ الگویی، هرچقدر هم بد نوشته شده باشد، نمیتواند باعث مصرف نمایی CPU در RE2 شود.
خلاصه اینکه، گوگل امنیت و پایداری در مقیاس عظیم را به انعطافپذیری و قابلیتهای پیچیدهای که PCRE ارائه میدهد، ترجیح داده است. به همین دلیل ما به عنوان متخصص سئو، باید یاد بگیریم که در ابزارهای گوگل، با محدودیتهای سینتکس RE2 کار کنیم.
مهمترین تفاوتهای سینتکس RE2 که باید بدانید
خب، حالا که میدانیم گوگل چرا RE2 را انتخاب کرده (سرعت و امنیت)، بیایید سراغ تفاوتهای فنی و عملی برویم که مستقیماً روی کار روزمره ما در سرچ کنسول یا آنالیتیکس تأثیر میگذارد.
تفاوت کلیدی اول: عدم پشتیبانی از Lookarounds (Lookahead و Lookbehind)
این بزرگترین و رایجترین تلهای است که بچهها در آن میافتند.
Lookarounds (نگاه به اطراف): در PCRE، اینها دستورات قدرتمندی هستند که به تو اجازه میدهند چیزی را بررسی کنی، بدون اینکه آن را به عنوان بخشی از متن نهایی انتخاب (match) کنی.
Lookahead (نگاه به جلو): مثلاً q(?=u) یعنی “حرف q را پیدا کن به شرطی که بلافاصله بعدش حرف u باشد” (اما u را انتخاب نکن).
Lookbehind (نگاه به عقب): مثلاً (?<=a)b یعنی “حرف b را پیدا کن به شرطی که بلافاصله قبلش حرف a باشد” (اما a را انتخاب نکن).
چرا در RE2 کار نمیکند؟
هر دو این دستورات (مخصوصاً Lookbehind) ذاتاً به الگوریتم Backtracking (بازگشت به عقب) نیاز دارند که ما در مورد خطرات امنیتی (ReDoS) آن صحبت کردیم. RE2 برای حفظ سرعت خطی خود، قید پشتیبانی از آنها را زده است.
تجربه عملی: اگر در سرچ کنسول تلاش میکنی URLهایی را پیدا کنی که شامل “A” باشند به شرطی که قبل یا بعدش “B” نباشد (یا باشد)، استفاده از Lookaroundها شما را به خطا میرساند. باید الگو را طوری بازنویسی کنی که بدون این قابلیت کار کند (که اغلب پیچیدهتر میشود اما امکانپذیر است).
تفاوت کلیدی دوم: محدودیت در استفاده از Backreferences
این هم یکی دیگر از قابلیتهای مبتنی بر Backtracking است که در RE2 با محدودیت جدی مواجه است.
Backreferences (ارجاع به عقب): در PCRE میتوانی یک بخش از الگو را داخل پرانتز () “گروهبندی” (Capture Group) کنی و بعداً در همان الگو با استفاده از 1 (برای گروه اول)، 2 (برای گروه دوم) و… به آن ارجاع دهی.
مثال PCRE: الگوی (w)1 کلماتی را پیدا میکند که یک حرف تکراری پشت سر هم دارند (مثلاً “Hello” یا “Google”). (w) حرف اول (مثلاً ‘l’) را میگیرد و 1 میگوید “دقیقاً همان چیزی که در گروه ۱ گرفتی را دوباره پیدا کن”.
وضعیت در RE2:
RE2 از گروهبندی (Capturing Groups) پشتیبانی میکند، اما استفاده از Backreference درون خود الگو را پشتیبانی نمیکند، چون این کار هم نیاز به “به خاطر سپردن” و “بازگشت به عقب” دارد.
نکته مهم: این به آن معنا نیست که تو نمیتوانی از پرانتز در RE2 استفاده کنی! تو میتوانی از پرانتز برای گروهبندی ((a|b)) یا استخراج داده (که در ابزارهایی مثل GA4 انجام میشود) استفاده کنی. فقط نمیتوانی درون خود الگو به آن گروه ارجاع دهی (مثل 1).
سایر قابلیتهای PCRE که در RE2 پشتیبانی نمیشوند
برای کاملتر شدن بحث، چند مورد دیگر هم هست که در RE2 وجود ندارد:
Possessive Quantifiers (کمیتسنجهای مالکانه): چیزهایی مثل *+, ++, ?+. اینها نسخههای خاصی از *, +, ? هستند که هرگز Backtrack نمیکنند (که به نظر خوب میآید)، اما پیادهسازی آنها در موتور مبتنی بر ماشین RE2 پیچیده است.
Atomic Groups (گروههای اتمی): با سینتکس (?>…). این هم یک ابزار کنترلی برای Backtracking است که در RE2 محلی از اعراب ندارد.
Conditional Patterns (الگوهای شرطی): مانند (?(if)then|else).
خبر خوب این است که تو به عنوان یک متخصص سئو، احتمالاً هرگز به این سه مورد آخر نیاز پیدا نخواهی کرد. اما ۹۰٪ مواقع، مشکل تو با RE2 به خاطر همان Lookaroundها خواهد بود.
جدول مقایسهای سینتکس: RE2 در برابر PCRE
این جدول به تو کمک میکند تفاوتها را در یک نگاه ببینی:
| قابلیت (Feature) | سینتکس PCRE (رایج) | سینتکس RE2 (گوگل) | توضیح |
|---|---|---|---|
| اصول اولیه (نقطه، ستاره، مثبت) | . * + ? | (پشتیبانی کامل) | (پشتیبانی کامل) |
| کلاسهای کاراکتر | [abc] [^abc] d w | – | – |
| گروهبندی (Grouping) | (abc) | – | – |
| انتخاب (Alternation) | (a|b) | – | – |
| نگاه به جلو (Lookahead) | (?=…) (?!…) | (پشتیبانی نمیشود) | – |
| نگاه به عقب (Lookbehind) | (?<=…) (?<!…) | (پشتیبانی نمیشود) | – |
| ارجاع به عقب (Backreference) | (w)1 | (پشتیبانی نمیشود) | – |
قابلیت (Feature)
سینتکس PCRE (رایج)
سینتکس RE2 (گوگل)
توضیح
اصول اولیه (نقطه، ستاره، مثبت)
. * + ?
(پشتیبانی کامل)
(پشتیبانی کامل)
کلاسهای کاراکتر
[abc] [^abc] d w
گروهبندی (Grouping)
(abc)
انتخاب (Alternation)
(a|b)
نگاه به جلو (Lookahead)
(?=…) (?!…)
(پشتیبانی نمیشود)
نگاه به عقب (Lookbehind)
(?<=…) (?<!…)
(پشتیبانی نمیشود)
ارجاع به عقب (Backreference)
(w)1
(پشتیبانی نمیشود)
سینتکس RE2 در عمل: کجا و چگونه از آن استفاده کنیم؟
بسیار خب، حالا که تئوری و تفاوتها را میدانیم، بیایید ببینیم این سینتکس RE2 دقیقاً کجاها جلوی راه ما سبز میشود و چطور باید با آن کار کنیم. واقعیت این است که اگر در اکوسیستم گوگل کار میکنید، شما همیشه در حال استفاده از RE2 هستید، حتی اگر خودتان خبر نداشته باشید.
کاربرد RE2 در گوگل سرچ کنسول (GSC)
اینجا، یعنی گوگل سرچ کنسول، اصلیترین جایی است که من و شما به عنوان متخصص سئو با محدودیتهای RE2 سینه به سینه میشویم.
کجا؟ در گزارش Performance (عملکرد)، وقتی میخواهید بر اساس Query, Page, Country یا Device فیلتر کنید، میتوانید نوع فیلتر را از “Contains” به “Custom (regex)” تغییر دهید.
چگونه؟
مثال (کاربرد ساده): فرض کنید میخواهید تمام URLهای بلاگ را که با /blog/ شروع میشوند یا تمام URLهای فروشگاه را که با /shop/ شروع میشوند، با هم ببینید.
الگوی RE2: ^/blog/|^/shop/
(علامت ^ یعنی “شروع خط” و | یعنی “یا”)
مثال (جایی که شکست میخوریم): اگر بخواهید URLهایی را پیدا کنید که شامل “A” باشند اما “B” نداشته باشند، اولین غریزه شما (بر اساس PCRE) ممکن است استفاده از Negative Lookahead مثل A(?!.*B) باشد. این الگو در GSC کار نخواهد کرد چون RE2 از Lookaround پشتیبانی نمیکند.
راه حل RE2: باید الگو را بازنویسی کنید. مثلاً باید URLهایی را پیدا کنید که فقط A دارند (^[^B]*A[^B]*$). این الگو پیچیدهتر میشود اما با منطق RE2 سازگار است.
استفاده از RE2 در گوگل آنالیتیکس (GA4)
در گوگل آنالیتیکس (هم یونیورسال قدیمی و هم GA4)، رجکس همهجا هست و تماماً بر اساس RE2 کار میکند.
کجا؟
فیلترها در گزارشها: هنگام فیلتر کردن دایمنشنها (مثل Page path, Event name).
ساخت Audience (مخاطب): برای تعریف گروههای کاربری خاص.
ساخت Segment (بخش): برای جداسازی بخشی از ترافیک.
تنظیمات Goal/Conversion (در یونیورسال): برای تعریف صفحاتی که به عنوان هدف شناخته میشوند.
چگونه؟
مثال: فرض کنید در GA4 میخواهید گزارش صفحات فرود (Landing Pages) را طوری فیلتر کنید که فقط صفحات دستهبندی محصولات (که مثلاً همگی به /category/ ختم میشوند) و صفحات خود محصولات (که یک عدد در URL دارند) را ببینید.
الگوی RE2: /category/$|/d+
(بخش اول /category/$ یعنی URLهایی که دقیقاً به /category/ ختم میشوند).
(بخش دوم /d+ یعنی URLهایی که شامل یک اسلش و سپس یک یا چند عدد هستند).
فیلتر کردن با RE2 در لوکر استودیو (Looker Studio)
لوکر استودیو (گوگل دیتا استودیو سابق) ابزار گزارشسازی ماست. وقتی این ابزار به منابع داده گوگل (مثل GSC و GA4) وصل میشود، برای هماهنگی کامل، از همان موتور RE2 برای پردازش رجکس استفاده میکند.
کجا؟
ساخت فیلترها (Filters): برای محدود کردن دادههای نمایش داده شده در چارتها.
ساخت فیلدهای محاسباتی (Calculated Fields): با استفاده از توابع اختصاصی رجکس.
چگونه؟
لوکر استودیو توابع مشخصی دارد:
REGEXP_MATCH(text, pattern): بررسی میکند که آیا متن با الگو مطابقت دارد یا نه (True/False میدهد).
REGEXP_EXTRACT(text, pattern): بخشی از متن را بر اساس الگو استخراج میکند.
REGEXP_REPLACE(text, pattern, replacement): بخشی از متن را جایگزین میکند.
مثال: فرض کنید URLهای شما دارای پارامتر هستند (مثل …/?source=google) و میخواهید در لوکر استودیو یک ستون تمیز بدون پارامترها بسازید.
الگوی RE2 (در تابع REGEXP_REPLACE):
Field: Page Path
Pattern: ?.* (یعنی علامت سوال و هر چیزی که بعد از آن میآید را پیدا کن)
Replacement: “” (با هیچی جایگزین کن)
این تابع هم دقیقاً با همان محدودیتهای RE2 (مثل عدم پشتیبانی از Lookaround) کار میکند.
توابع مبتنی بر RE2 در گوگل شیتس (Google Sheets)
این یکی از آن نکات ریزی است که خیلیها نمیدانند! اگر عادت داری دادههای سئو (مثلاً خروجی GSC) را در گوگل شیتس تحلیل کنی، باید بدانی که توابع رجکس در گوگل شیتس هم از موتور RE2 استفاده میکنند، نه PCRE.
کجا؟ سه تابع اصلی:
=REGEXMATCH(text, pattern)
=REGEXEXTRACT(text, pattern)
=REGEXREPLACE(text, pattern, replacement)
چگونه؟
مثال: فرض کنید لیستی از کوئریها را از GSC در گوگل شیتس کپی کردهاید و میخواهید بررسی کنید کدامیک “برند” (Brand) و کدامیک “غیر برند” (Non-Brand) هستند. (فرض کنیم برند شما “وزیر سئو” است).
فرمول RE2: =REGEXMATCH(A2, “(?i)وزیر سئو”)
(سلول A2 متن کوئری است).
(?i) یک “فلگ” (Flag) در RE2 است که الگو را Case-Insensitive (حساس نبودن به بزرگی و کوچکی حروف) میکند. این یکی از قابلیتهای مفید RE2 است که به خوبی کار میکند.
اگر در همین گوگل شیتس سعی کنید از الگویی با Lookbehind استفاده کنید، با خطای N/A# مواجه خواهید شد.
جمعبندی تجربه عملی: درک RE2 یعنی درک محدودیتهای ابزارهای روزمره ما. به جای تلاش برای استفاده از الگوهای پیچیده PCRE، باید یاد بگیریم چطور با ابزارهای سادهتر اما امنتر RE2 به همان نتایج برسیم.
مثالهای کاربردی RE2 برای سئوکاران و تحلیلگران (مبتنی بر تجربه)
اینها مثالهایی هستند که من (حسین محمودی) و همکارانم در “وزیر سئو” به صورت روزانه برای تحلیل دادهها از آنها استفاده میکنیم. اینها دقیقاً همان تفاوت بین تئوری و عمل را نشان میدهند.
مثال ۱: فیلتر کردن کوئریهای برند در سرچ کنسول
این یکی از پایهایترین و در عین حال حیاتیترین کارهایی است که روزانه انجام میدهیم: جدا کردن ترافیک “برند” (Brand) از “غیر برند” (Non-Brand).
سناریو: فرض کنید برند ما “وزیر سئو” است و میخواهیم تمام کوئریهایی که شامل “وزیر سئو”، “سئو وزیر”، “vazir seo” یا “vazirseo” (و املای اشتباه رایج “وزیرسو”) هستند را پیدا کنیم.
ابزار: GSC > Performance > Query > +New > Custom (regex)
برای دیدن کوئریهای برند (Matches regex):
الگوی RE2: (وزیر سئو|سئو وزیر|vazir seo|vazirseo|وزیرسو)
توضیح: از پرانتز () برای گروهبندی و از | (پایپ) به معنی “یا” استفاده کردیم.
برای دیدن کوئریهای غیر برند (Doesn’t match regex):
الگوی RE2: از همان الگوی بالا استفاده میکنیم ((وزیر سئو|سئو وزیر|vazir seo|vazirseo|وزیرسو))، اما فیلتر را روی Doesn’t match regex تنظیم میکنیم.
تجربه عملی: این گزارش (غیر برند) معمولاً برای پیدا کردن فرصتهای محتوایی جدید (Keyword Gap) و بررسی سلامت سئوی سایت، از گزارش کوئریهای برند هم ارزشمندتر است.
مثال ۲: گروهبندی URLهای بلاگ در آنالیتیکس
در آنالیتیکس (چه GA4 و چه یونیورسال)، ما دائماً نیاز داریم که صفحات را بر اساس بخشبندی سایت (مثل بلاگ، فروشگاه، لندینگ) دستهبندی کنیم.
سناریو: میخواهیم در گزارش “Pages and screens” در GA4، فقط URLهای بلاگ را ببینیم. فرض میکنیم URLهای بلاگ ما یا با /blog/ شروع میشوند یا با /mag/ (مخفف مجله).
ابزار: GA4 > Reports > Filter > Page path and screen class > matches regex
الگوی RE2: ^/(blog|mag)/
توضیح:
^: این کاراکتر مهم به موتور RE2 میگوید که الگو باید از ابتدای رشته (Page path) شروع شود.
/: خود کاراکتر اسلش.
(blog|mag): یک گروه که میگوید “کلمه blog یا کلمه mag”.
/: اسلش بعدی که بعد از این کلمات میآید.
این الگو تمام URLهای مثل /blog/seo-tips و /mag/content-strategy را به ما نشان میدهد، اما صفحهای مثل /about/blog را (به دلیل وجود ^) انتخاب نمیکند.
مثال ۳: استخراج بخشی از URL در لوکر استودیو
این یکی از تکنیکهای مورد علاقه من برای تمیز کردن دادهها و ساخت داشبوردهای کاربردی در لوکر استودیو (Looker Studio) است.
سناریو: فرض کنید URLهای بلاگ شما ساختار …/blog/category-name/post-name دارند. مثلاً /blog/seo/re2-guide یا /blog/content/how-to-write. ما میخواهیم یک ستون جدید در گزارش خود فقط با نام دستهبندی (یعنی “seo” یا “content”) بسازیم.
ابزار: Looker Studio > Resource > Manage added data sources > Edit > Add a Field
تابع RE2: REGEXP_EXTRACT(Page path, ‘^/blog/([^/]+)/’)
توضیح:
REGEXP_EXTRACT: به لوکر استودیو میگوید “میخواهم بخشی از متن را استخراج کنم”.
Page path: ستونی که دادههای URL در آن قرار دارند.
^/blog/: الگو با /blog/ شروع میشود.
([^/]+): این بخش کلیدی است. () یعنی “این قسمت را برای من استخراج کن (Capture Group)”. داخل آن [^/] یعنی “هر کاراکتری به جز اسلش” و + یعنی “یک یا چند بار”. پس ([^/]+) در مجموع یعنی “هر متنی را که بین دو اسلش قرار دارد، بگیر”.
نتیجه این فیلد محاسباتی، یک ستون تمیز فقط با نام دستهبندیها خواهد بود که برای ساخت چارتهای دایرهای عالی است.
مثال ۴: راهحل جایگزین برای Lookaround در GSC
اینجا دقیقاً همانجایی است که تجربه به کمک میآید و ۹۹٪ افراد گیر میکنند و میگویند “رجکس سرچ کنسول کار نمیکند!”. در حالی که کار میکند، فقط RE2 است.
سناریو: میخواهیم کوئریهایی را پیدا کنیم که شامل کلمه “سئو” هستند، اما شامل کلمه “آموزش” نیستند.
راه حل اشتباه (مبتنی بر PCRE):
سئو(?!.*آموزش)
این الگو از Negative Lookahead (?!…) استفاده میکند و در GSC با خطا مواجه میشود یا هیچ نتیجهای برنمیگرداند، چون RE2 از آن پشتیبانی نمیکند.
راه حل جایگزین (مبتنی بر تجربه و RE2):
به جای نوشتن یک الگوی پیچیده (که در RE2 غیرممکن است)، ما در GSC میتوانیم فیلترها را زنجیر (Chain) کنیم. این سادهترین و تمیزترین راه است:
فیلتر اول: Query > Custom (regex) > Matches regex > سئو
فیلتر دوم: +New > Query > Custom (regex) > Doesn’t match regex > آموزش
نتیجه: سرچ کنسول هر دو شرط را با هم اِعمال میکند. این کار دقیقاً همان نتیجه Lookaround را به ما میدهد، اما با استفاده از رابط کاربری خود GSC و کاملاً سازگار با منطق RE2. این یک تکنیک عملی است که خیلی از مشکلات تحلیلی ما را حل میکند.
اشتباهات رایج و محدودیتهای RE2 (و نحوه عبور از آنها)
“چرا Regex من در سرچ کنسول کار نمیکند؟” (اشکالیابی رایج)
این سوالی است که تقریباً هر روز میشنوم. وقتی یک متخصص سئو میگوید “رجکس GSC کار نمیکند”، این دقیقاً ۹۹٪ مواقع به یکی از این سه دلیل برمیگردد:
تلاش برای استفاده از سینتکس PCRE (مخصوصاًLookarounds):
این متداولترین اشتباه است. شما یک الگوی بینقص در ابزاری مثل Regex101 (که پیشفرضش PCRE است) مینویسید، آن را در GSC کپی میکنید و هیچ نتیجهای برنمیگردد.
علت: شما از (?=…) (نگاه به جلو) یا (?<=…) (نگاه به عقب) استفاده کردهاید. همانطور که گفتیم، RE2 از اینها پشتیبانی نمیکند.
راهحل (تجربه عملی): از ترفند “زنجیر کردن فیلترها” که در مثال قبل گفتم استفاده کنید. (مثلاً یک فیلتر Matches regex برای “سئو” و بلافاصله یک فیلتر Doesn’t match regex برای “آموزش”).
اشتباهات پایهای در سینتکس (فراموش کردن Escaping):
سناریو: میخواهید URLهای product.php را پیدا کنید.
الگوی اشتباه: product.php
چرا؟ در رجکس، نقطه (.) یک کاراکتر ویژه (Wildcard) است به معنی “هر کاراکتری”. پس این الگو، product-php یا productXphp را هم پیدا میکند.
الگوی صحیح (RE2): product.php
توضیح: باید کاراکترهای ویژه (مثل . ? * +) را با یک بکاسلش () اصطلاحاً “Escape” کنید تا موتور رجکس آنها را به عنوان کاراکتر عادی (Literal) بشناسد.
منطق اشتباه در مورد ^ و $:
سناریو: میخواهید فقط صفحه اصلی (/) را فیلتر کنید.
الگوی اشتباه: /
چرا؟ این الگو هر URLی که شامل اسلش باشد را پیدا میکند (یعنی همه URLها).
الگوی صحیح (RE2): ^/$
توضیح: ^ یعنی “شروع دقیق رشته” و $ یعنی “پایان دقیق رشته”. این الگو به RE2 میگوید “رشتهای را پیدا کن که دقیقاً با / شروع و بلافاصله تمام شود”.
ابزارهای آنلاین برای تست و اعتبارسنجی سینتکس RE2
اینکه الگوی خود را کجا تست میکنید، به اندازه خود الگو مهم است.
Regex101 (با تنظیمات درست):
مشکل: همه از Regex101.com استفاده میکنند، اما نمیدانند که پیشفرض آن PCRE (PHP) است که ما را به اشتباه میاندازد.
راهحل (نکته کلیدی): وقتی وارد این سایت میشوید، در منوی کناری سمت چپ، بخش “FLAVOR” را از “PCRE2” به “Go (Golang)” تغییر دهید.
چرا Golang؟ چون کتابخانه استاندارد رجکس در زبان برنامهنویسی Go (که گوگل آن را ساخته) دقیقاً بر اساس موتور RE2 پیادهسازی شده است. تست در این حالت، نزدیکترین شبیهسازی به محیط GSC و GA4 است.
Google Sheets (تستکننده مخفی من):
تجربه شخصی: این بهترین، سریعترین و در دسترسترین ابزار برای تست RE2 است.
چگونه؟ یک ستون با دادههای نمونه (چند URL یا کوئری) بسازید. در ستون کناری، از تابع =REGEXMATCH استفاده کنید.
مثال: =REGEXMATCH(A2, “^/blog/”)
اگر این تابع TRUE برگرداند، یعنی الگوی شما از نظر سینتکس RE2 کاملاً معتبر است و در GSC یا GA4 هم دقیقاً همانطور عمل خواهد کرد. اگر الگویتان غلط باشد (مثلاً از Lookaround استفاده کنید)، گوگل شیتس بلافاصله خطای #N/A (Error: Invalid argument) برمیگرداند.
ابزارهای سادهتر (مثل https://www.google.com/search?q=Regex-Golang.com):
سایتهای آنلاین دیگری هم هستند که مستقیماً یک Sandbox (محیط تست) برای موتور Golang/RE2 ارائه میدهند. اینها رابط کاربری سادهتری دارند و فقط کار اعتبارسنجی را انجام میدهند.
چه زمانی باید از RE2 صرف نظر کرد؟
بخشی از تخصص این است که بدانیم چه زمانی ابزار فعلی جواب نمیدهد و باید سراغ راهحل دیگری برویم.
زمان صرف نظر کردن: زمانی که منطق فیلتر شما ذاتاً به چیزی نیاز دارد که RE2 آن را فدا کرده است. (مخصوصاً Backreferences پیچیده یا Lookarounds). اگر میبینید که ۳۰ دقیقه است درگیر نوشتن یک الگوی RE2 هستید تا نبودِ Lookbehind را جبران کنید، وقتش است که متوقف شوید.
راهحل و نحوه عبور (The Escape Hatch):
دادهها را Export کنید: به جای اینکه سعی کنید در خود رابط کاربری GSC یا GA4 تحلیل پیچیده انجام دهید، دادهها را به صورت خام (CSV یا Google Sheets) خروجی بگیرید.
از ابزار قویتر استفاده کنید:
Google Sheets/Excel: حالا که دادهها را دارید، میتوانید از فیلترهای خود اکسل یا شیتس استفاده کنید.
پایتون (Python): اگر تحلیلگر هستید، دادهها را در پایتون (مثلاً با Pandas) بخوانید. کتابخانه re در پایتون از رجکس بسیار قدرتمند (شبیه PCRE) پشتیبانی میکند و میتوانید هر بلایی که میخواهید سر دادهها بیاورید.
Looker Studio: حتی در لوکر استودیو، گاهی اوقات نوشتن یک CASE WHEN … THEN … (که در آن چند REGEXP_MATCH ساده را ترکیب میکنید) خواناتر و بهینهتر از نوشتن یک الگوی RE2 غولپیکر و پیچیده است.
جمعبندی تجربه عملی: RE2 برای فیلتر کردن سریع و امن دادهها در مقیاس بزرگ (کاری که گوگل میکند) طراحی شده است، نه برای تحلیل داده و دستکاری عمیق متنی. مرز این دو را بشناسید و اگر نیازتان پیچیده شد، به سادگی دادهها را Export کنید.
برگه تقلب (Cheat Sheet) سینتکس RE2
اینجا خلاصهای از پرکاربردترین دستورات RE2 است که در ابزارهای گوگل (GSC, GA4, Looker Studio, Sheets) به کارت میآید. این را دم دست داشته باش.
متاکاراکترهای پرکاربرد
اینها کاراکترهای پایهای هستند که معنی خاصی در رجکس دارند.
| سینتکس (Syntax) | معنی | مثال کاربردی (در GSC) |
|---|---|---|
| . | هر کاراکتر تکی (Single Character) | seo.tips با seo-tips و seo/tips مطابقت دارد. |
| ^ | شروع دقیق رشته (Start of String) | ^/blog صفحاتی که دقیقاً با /blog شروع میشوند را پیدا میکند. |
| $ | پایان دقیق رشته (End of String) | /blog/$ صفحهای که دقیقاً /blog/ است را پیدا میکند (نه /blog/post). |
| * | صفر یا چند بار تکرار کاراکتر قبلی | seo* با se و seo و seooo مطابقت دارد. |
| + | یک یا چند بار تکرار کاراکتر قبلی | seo+ با seo و seooo مطابقت دارد (اما با se نه). |
| ? | صفر یا یک بار تکرار کاراکتر قبلی (اختیاری) | https? با http و https مطابقت دارد (حرف s اختیاری است). |
| نادیده گرفتن کاراکتر ویژه (Escape) | product.php فقط product.php را پیدا میکند (نه productXphp). |
سینتکس (Syntax)
معنی
مثال کاربردی (در GSC)
.
هر کاراکتر تکی (Single Character)
seo.tips با seo-tips و seo/tips مطابقت دارد.
^
شروع دقیق رشته (Start of String)
^/blog صفحاتی که دقیقاً با /blog شروع میشوند را پیدا میکند.
$
پایان دقیق رشته (End of String)
/blog/$ صفحهای که دقیقاً /blog/ است را پیدا میکند (نه /blog/post).
*
صفر یا چند بار تکرار کاراکتر قبلی
seo* با se و seo و seooo مطابقت دارد.
+
یک یا چند بار تکرار کاراکتر قبلی
seo+ با seo و seooo مطابقت دارد (اما با se نه).
?
صفر یا یک بار تکرار کاراکتر قبلی (اختیاری)
https? با http و https مطابقت دارد (حرف s اختیاری است).
نادیده گرفتن کاراکتر ویژه (Escape)
product.php فقط product.php را پیدا میکند (نه productXphp).
کلاسهای کاراکتری (Character Classes)
اینها به شما اجازه میدهند به جای یک کاراکتر خاص، گروهی از کاراکترها را مشخص کنید.
| سینتکس (Syntax) | معنی | مثال کاربردی (در GA4) |
|---|---|---|
| [abc] | هر کدام از کاراکترهای داخل براکت (a یا b یا c) | /[abc]/ با /a/، /b/ یا /c/ مطابقت دارد. |
| [^abc] | هر کاراکتری به جز کاراکترهای داخل براکت | [^@] یعنی “هر کاراکتری به جز @” |
| [a-z] | هر حرف کوچک انگلیسی (از a تا z) | [a-z]+ یعنی “یک یا چند حرف کوچک”. |
| [0-9] | هر عدد (از 0 تا 9) | [0-9]{3} یعنی “دقیقاً سه عدد پشت سر هم”. |
| d | هر کاراکتر عددی (Digit) – (معادل [0-9]) | /d+/ URLهایی که شامل عدد هستند (مثل URL محصولات) را پیدا میکند. |
| D | هر کاراکتر غیر عددی (Non-Digit) | |
| w | هر کاراکتر “کلمه” (Word) – (معادل [a-zA-Z0-9_]) | |
| W | هر کاراکتر غیر “کلمه” | |
| s | هر کاراکتر فاصله خالی (Whitespace) | seostips کوئری seo tips (با یک فاصله) را پیدا میکند. |
سینتکس (Syntax)
معنی
مثال کاربردی (در GA4)
[abc]
هر کدام از کاراکترهای داخل براکت (a یا b یا c)
/[abc]/ با /a/، /b/ یا /c/ مطابقت دارد.
[^abc]
هر کاراکتری به جز کاراکترهای داخل براکت
[^@] یعنی “هر کاراکتری به جز @”
[a-z]
هر حرف کوچک انگلیسی (از a تا z)
[a-z]+ یعنی “یک یا چند حرف کوچک”.
[0-9]
هر عدد (از 0 تا 9)
[0-9]{3} یعنی “دقیقاً سه عدد پشت سر هم”.
d
هر کاراکتر عددی (Digit) – (معادل [0-9])
/d+/ URLهایی که شامل عدد هستند (مثل URL محصولات) را پیدا میکند.
D
هر کاراکتر غیر عددی (Non-Digit)
w
هر کاراکتر “کلمه” (Word) – (معادل [a-zA-Z0-9_])
W
هر کاراکتر غیر “کلمه“
s
هر کاراکتر فاصله خالی (Whitespace)
seostips کوئری seo tips (با یک فاصله) را پیدا میکند.
اپراتورها و گروهبندیها
اینها برای ترکیب الگوها و ایجاد منطقهای پیچیدهتر استفاده میشوند.
| سینتکس (Syntax) | معنی | مثال کاربردی (در GSC/GA4) |
|---|---|---|
| | | “یا” (OR / Alternation) | (seo|c-r-o) کوئریهایی که شامل “seo” یا “c-r-o” هستند را پیدا میکند. |
| (…) | گروهبندی (Grouping) | ^/(blog|mag)/ صفحاتی که با /blog/ یا /mag/ شروع میشوند را پیدا میکند. |
| {n} | دقیقاً n بار تکرار | d{4} یعنی “دقیقاً 4 عدد پشت هم” (مثل سال میلادی). |
| {n,} | حداقل n بار تکرار | d{2,} یعنی “حداقل 2 عدد پشت هم”. |
| {n,m} | بین n تا m بار تکرار | w{3,5} یعنی “کلمهای با 3، 4 یا 5 کاراکتر”. |
| (?:…) | گروهبندی بدون استخراج (Non-Capturing) | (?:http|https):// شبیه `(http |
سینتکس (Syntax)
معنی
مثال کاربردی (در GSC/GA4)
|
“یا” (OR / Alternation)
(seo|c-r-o) کوئریهایی که شامل “seo” یا “c-r-o” هستند را پیدا میکند.
(…)
گروهبندی (Grouping)
^/(blog|mag)/ صفحاتی که با /blog/ یا /mag/ شروع میشوند را پیدا میکند.
{n}
دقیقاً n بار تکرار
d{4} یعنی “دقیقاً 4 عدد پشت هم” (مثل سال میلادی).
{n,}
حداقل n بار تکرار
d{2,} یعنی “حداقل 2 عدد پشت هم”.
{n,m}
بین n تا m بار تکرار
w{3,5} یعنی “کلمهای با 3، 4 یا 5 کاراکتر”.
(?:…)
گروهبندی بدون استخراج (Non-Capturing)
(?:http|https):// شبیه `(http
جمعبندی (پایان محتوا)
جمعبندی: RE2، موتور رجکس گوگل، بد یا ضعیف نیست؛ فقط برای هدف متفاوتی ساخته شده است: امنیت و پایداری در مقیاس عظیم. گوگل آگاهانه، قابلیتهای پیچیدهای مثل Lookaround (که در PCRE وجود دارد) را فدای جلوگیری از حملات ReDoS و تضمین سرعت خطی (Linear Time) کرده است.
نکته عملی (تجربه من): به جای اینکه ساعتها وقت صرف نوشتن یک الگوی RE2 پیچیده برای جبران نبودِ Lookaround کنید، مسیر خود را عوض کنید. در سرچ کنسول از «زنجیر کردن فیلترها» (یک فیلتر Matches و یک فیلتر Doesn’t Match پشت سر هم) استفاده کنید. اگر تحلیل شما پیچیدهتر است، به سادگی دادهها را Export کرده و در گوگل شیتس یا پایتون (که از رجکس قویتری پشتیبانی میکند) پردازش کنید. درک این محدودیت، بیشتر از حفظ کردن سینتکسها، در زمان شما صرفهجویی میکند.