مقالات

sو Sدر Regex: راهنمای کامل تطبیق فضاهای خالی (Whitespace)

sو Sدر Regex: راهنمای کامل تطبیق فضاهای خالی (Whitespace)

سلام! من سارا بحرانی‌ام. اگه تا حالا با پردازش متن یا تمیز کردن داده‌های ورودی کاربر سروکله زده باشی، حتماً می‌دونی که «فضاهای خالی» (Whitespace) چقدر می‌تونن دردسرساز باشن. فاصله‌های اضافه، تب‌های ناخواسته، خطوط جدید… همه‌ی این‌ها می‌تونن داده‌های تو رو خراب کنن.

خوشبختانه، Regex (عبارات باقاعده) دو تا ابزار فوق‌العاده قدرتمند برای مدیریت این هرج‌ومرج به ما می‌ده: s و S. این دو دستور، جزو معروف‌ترین کلاس های کاراکتری (Character Classes) هستن و درک تفاوتشون برای هر متخصص سئو یا برنامه‌نویسی حیاتیه.

توی این راهنما، می‌خوام بهت نشون بدم این دو میان‌بر دقیقاً چی هستن، چه فرقی با هم دارن و چطور می‌تونی ازشون مثل یه حرفه‌ای برای پاکسازی و استخراج داده استفاده کنی.

جدول مقایسه سریع s و S (در یک نگاه)

قبل از اینکه عمیق بشیم، بیا تفاوت اصلی این دو دستور رو توی این جدول با هم ببینیم:

ویژگی s (s کوچک) S (S بزرگ)
معنی فضای خالی (Whitespace) غیر-فضای خالی (Non-Whitespace)
معادل فنی [ tnrfv] [^ tnrfv]
چه چیزی را پیدا می‌کند؟ فاصله، تب، خط جدید، بازگشت به اول خط و… حروف، اعداد، نمادها، علائم نگارشی
کاربرد اصلی جداسازی (Split) و پاکسازی (Trim) استخراج (Find all) و اعتبارسنجی
مثال در سلام ۱۲۳!” (فقط فاصله بین “سلام” و “۱۲۳”) [“سلام”, “۱۲۳!”] (دو توکن جدا)

s چیست؟ (میان‌بر کلاس کاراکتر فضای خالی)

توی دنیای Regex (عبارات باقاعده)، ما یه سری “کلاس کاراکتر” (Character Class) داریم که کارشون خلاصه‌سازیه. s (که با “s” کوچک نوشته می‌شه و مخفف “space” هست) یکی از معروف‌ترین اون‌هاست.

به زبان ساده، s یه دستور میان‌بره که به موتور regex می‌گه: “دنبال هر نوع کاراکتر فضای خالی بگرد.”

به جای اینکه مجبور باشی دونه‌دونه بهش بگی “دنبال فاصله (space) بگرد، یا دنبال تب (tab) بگرد، یا دنبال خط جدید (newline) بگرد…”، تو خیلی راحت فقط می‌نویسی s.

این دستور توی کارهایی مثل تمیز کردن داده‌ها، اعتبارسنجی فرم‌ها (مثلاً وقتی می‌خوای مطمئن بشی کاربر فقط فاصله خالی توی فیلد نام وارد نکرده) یا حتی توی تنظیمات پیشرفته‌تر مثل فایل .htaccess سرور، فوق‌العاده کاربردیه.

s دقیقاً چه چیزهایی را تطبیق می‌دهد؟

حالا بیایم دقیق‌تر ببینیم وقتی از s استفاده می‌کنی، دقیقاً چه کاراکترهایی رو توی متن پیدا می‌کنی. این میان‌بر در حالت استاندارد، شامل این موارد می‌شه:

کاراکتر فاصله (Space: ): این همون اسپیس معمولیه که با زدن دکمه بزرگ روی کیبوردت ایجاد می‌کنی.

کاراکتر تب (Tab: t): فاصله‌ای که با زدن دکمه Tab ایجاد می‌شه و معمولاً پهنای بیشتری داره.

کاراکتر خط جدید (Newline: n): کاراکتری که وقتی Enter می‌زنی و مکان‌نما به خط بعدی می‌ره، ثبت می‌شه (رایج در سیستم‌های یونیکس و لینوکس).

کاراکتر بازگشت به ابتدای خط (Carriage Return: r): یه کاراکتر کنترلی قدیمی‌تر که مکان‌نما رو به اول همون خط برمی‌گردونه. (سیستم‌عامل ویندوز معمولاً از ترکیب rn برای رفتن به خط جدید استفاده می‌کنه).

و سایر فضاهای خالی: شامل دو مورد کم‌کاربردتر به اسم‌های تب عمودی (Vertical Tab: v) و پرش صفحه (Form Feed: f) که بیشتر در پرینترها و سیستم‌های خیلی قدیمی کاربرد داشتن.

تعریف فنی: s به عنوان معادل [ tnrfv]

اگر بخوایم بحث رو کمی فنی‌تر کنیم، s در اکثر موتورهای regex استاندارد (که بهشون “flavor” هم می‌گن)، دقیقاً با عبارت [ tnrfv] برابره.

بیا این عبارت فنی رو با هم بشکافیم:

[] (براکت‌ها) توی regex یعنی: “هر کدوم از کاراکترهایی که داخل من هستن رو تطبیق بده.”

tnrfv هم دقیقاً همون لیستی از کاراکترهاست که توی بخش قبلی با هم دیدیم (شامل یک فاصله، سپس تب، خط جدید و…).

بنابراین، s فقط یه راه کوتاه، تمیز و خواناتر برای نوشتن [ tnrfv] هست. تو به جای نوشتن اون عبارت طولانی، فقط از s استفاده می‌کنی.

تله یونیکد (Unicode): آیا s فاصله‌های یونیکد را تطبیق می‌دهد؟

اینجا دقیقاً همون‌جاییه که خیلی‌ها، مخصوصاً ما فارسی‌زبان‌ها، به تله می‌افتیم. پس خوب حواست رو جمع کن!

جواب کوتاه: بستگی به موتور Regex و تنظیمات تو داره!

حالت سنتی (ASCII/POSIX): در حالت استاندارد و قدیمی، s فقط همون ۶ کاراکتری رو که بالا لیست کردیم ([ tnrfv]) می‌شناسه.

مشکل کجاست؟ زبان فارسی (و خیلی زبان‌های دیگه) کاراکترهای فاصله‌ی دیگه‌ای هم دارن که جزو استاندارد یونیکد (Unicode) هستن. معروف‌ترین مثال برای ما «فاصله مجازی» یا «نیم‌فاصله» است (که فنی‌ش می‌شه Zero-width non-joiner یا ZWNJ). ما از این کاراکتر توی کلماتی مثل «می‌شود» یا «خانه‌ها» استفاده می‌کنیم.

sاستاندارد، این نیم‌فاصله رو پیدا نمی‌کنه!

خب، راه حل چیه؟

توی موتورهای regex مدرن (مثل مواردی که در پایتون، جاوااسکریپت، PHP یا .NET استفاده می‌شه)، تو می‌تونی «حالت یونیکد» رو فعال کنی.

برای مثال، در جاوااسکریپت، این کار رو با اضافه کردن فلگ u انجام می‌دی: /s/u

وقتی حالت یونیکد فعاله، s خیلی قوی‌تر عمل می‌کنه و علاوه بر اون ۶ مورد استاندارد، تمام کاراکترهای دیگه‌ای رو هم که در استاندارد یونیکد به عنوان “فاصله” (Whitespace یا Separator) تعریف شدن، پیدا می‌کنه.

نکته حرفه‌ای: اگر می‌خوای مطمئن بشی که فقط فاصله‌های تعریف‌شده در یونیکد (شامل نیم‌فاصله) رو پیدا می‌کنی، بهتره از دستور دقیق‌تر p{Z} یا p{Whitespace} استفاده کنی. (البته این دستور هم نیازمند پشتیبانی موتور regex از یونیکده).

پس همیشه یادت باشه: اگه با متن فارسی کار می‌کنی و نیم‌فاصله‌ها برات مهمن، حتماً چک کن که موتور regex تو از یونیکد پشتیبانی می‌کنه و تو اون حالت رو فعال کردی.

S چیست؟ (میان‌بر کلاس کاراکتر غیر-فضای خالی)

همون‌طور که شاید حدس زده باشی، S (با “S” بزرگ) دقیقاً برعکس s عمل می‌کنه.

به زبان ساده، S (که مخفف “Non-Space” یا “غیر-فضای خالی” هست) یک میان‌بر در Regex است که به موتور جستجو می‌گه: دنبال هر کاراکتری بگرد که فضای خالی نیست.”

هر چیزی که s اون رو پیدا می‌کرد (مثل فاصله، تب، خط جدید)، S اون‌ها رو نادیده می‌گیره و در عوض، تمام کاراکترهای دیگه رو برات پیدا می‌کنه. این دستور برای جدا کردن کلمات از فضاها یا پیدا کردن بخش‌های اصلی متن فوق‌العاده کاربردیه.

تعریف دقیق: S به عنوان معادل [^ tnrfv]

اگر بخوایم دوباره فنی صحبت کنیم، S در موتورهای Regex استاندارد، دقیقاً برابر با عبارت [^ tnrfv] هست.

بیا این کد رو هم با هم رمزگشایی کنیم:

[] (براکت‌ها) که همون کلاس کاراکتره.

^ (کارِت یا هشت کوچک): این نماد وقتی اولین کاراکتر داخل براکت [] باشه، معنای “نقیض” (Negation) یا “NOT” می‌ده. یعنی می‌گه: “هر چیزی به جز این‌هایی که در ادامه می‌بینی.”

tnrfv: این همون لیست ۶تایی فضاهای خالی استاندارده که قبلاً دیدیم.

پس وقتی می‌نویسی S، در واقع داری به Regex دستور می‌دی: “هر کاراکتری رو پیدا کن که در لیست فضاهای خالی ( tnrfv) وجود نداشته باشه.”

S چه چیزهایی را تطبیق می‌دهد؟ (هر چیزی جز فضای خالی)

خیلی ساده‌ست: S تمام کاراکترهای قابل چاپ (و حتی برخی غیرقابل چاپ!) رو پیدا می‌کنه، به شرطی که جزو اون ۶ مورد استاندارد فضای خالی نباشن.

این یعنی S موارد زیر رو به راحتی تطبیق می‌ده:

حروف: شامل تمام حروف الفبای انگلیسی (a-z, A-Z)، حروف فارسی (الف تا ی)، و حروف هر زبان دیگه‌ای.

اعداد: شامل تمام ارقام (0-9)، ارقام فارسی (۰ تا ۹) و…

علائم نگارشی و نمادها: هر نمادی مثل نقطه (.)، کاما (,)، علامت سوال (؟ یا ?)، علامت تعجب (!)، درصد (%)، دلار ($)، ستاره (*)، پرانتزها (() یا []) و خلاصه هر چیز دیگه‌ای که فاصله نباشه.

نکته مهم نیم‌فاصله: یادت میاد گفتیم s استاندارد، «نیم‌فاصله» (ZWNJ) فارسی رو پیدا نمی‌کنه؟ خب، چون نیم‌فاصله جزو لیست s نیست، پس S اون رو پیدا می‌کنه! این یه نکته خیلی مهمه که باید موقع کار با متن فارسی و S حواست بهش باشه.

رابطه معکوس: S دقیقاً هر چیزی است که s نیست

این بهترین راه برای به خاطر سپردن این دو دستوره. s و S مثل شب و روز یا مثبت و منفی هستن.

s = دنبال فضای خالی بگرد.

S = دنبال هر چیزی که فضای خالی نیست بگرد.

هر کاراکتر در یک رشته متنی، یا با s تطبیق داده می‌شه یا با S. هیچ کاراکتری وجود نداره که بتونه همزمان توسط هر دوی این‌ها پیدا بشه. اون‌ها دقیقاً مکمل همدیگه هستن.

کاربردهای عملی s: جداسازی و پاکسازی

توی برنامه‌نویسی و کار با داده، تو به ندرت با متن‌های کاملاً تمیز و بی‌نقص سروکار داری. متن‌ها پر از فاصله‌های اضافه، تب‌های ناخواسته و خطوط جدید هستن. s ابزار اصلی تو برای مدیریت این آشفتگیه.

کاربرد کلاسیک: جداسازی (Split) یک جمله به کلمات (s+)

این یکی از پایه‌ای‌ترین کارهاییه که هر برنامه‌نویسی انجام می‌ده: چطور می‌تونی یه جمله رو بشکنی و کلماتش رو جدا کنی؟

مشکل: تو یه جمله داری مثل: “سلام! خوش اومدی.” (که بین “خوش” و “اومدی” ۲تا فاصله هست). تو می‌خوای این رو به لیستی از کلمات تبدیل کنی: [“سلام!”, “خوش”, “اومدی.”]

راه حل Regex: تو از دستور split (که در اکثر زبان‌های برنامه‌نویسی وجود داره) به همراه الگوی s+ استفاده می‌کنی.

چرا s+و نه فقط s؟

s یعنی یک کاراکتر فضای خالی.

+ (پلاس) در Regex یعنی: یک یا چندتا از الگوی قبلی.

بنابراین s+ یعنی: “یک یا چندتا کاراکتر فضای خالی پشت سر هم”.

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

پاکسازی داده: حذف فضاهای خالی اضافه از ابتدا یا انتهای رشته (Trimming)

خیلی وقت‌ها، داده‌هایی که از کاربر می‌گیری (مثلاً توی یه فرم) پر از فاصله‌های اضافیه که کاربر ندیده یا اشتباهی وارد کرده. مثلاً به جای “Sara” وارد کرده ” Sara ” (هم از اول و هم از آخر فاصله داره). این فاصله‌ها می‌تونن کل دیتابیس تو رو به هم بریزن.

مشکل: می‌خوای تمام فاصله‌های خالی (شامل فاصله، تب و…) رو از شروع و پایان یک رشته حذف کنی، اما به فاصله‌های وسط متن کاری نداشته باشی.

راه حل Regex:

حذف از ابتدا: از الگوی ^s+ استفاده می‌کنی.

^ (کارِت) یعنی: “دقیقاً از ابتدای رشته شروع کن”.

s+ یعنی: “یک یا چند فضای خالی رو پیدا کن”.

حذف از انتها: از الگوی s+$ استفاده می‌کنی.

s+ یعنی: “یک یا چند فضای خالی رو پیدا کن”.

$ (دلار) یعنی: “که دقیقاً به انتهای رشته چسبیده باشن”.

تو معمولاً این دو الگو رو پیدا می‌کنی و اون‌ها رو با یک رشته خالی (“”) جایگزین می‌کنی تا متن تمیز یا “Trim” بشه. (البته خیلی از زبان‌ها تابع .trim() آماده هم دارن، ولی ریشه و قدرت اصلی اون‌ها از همین منطق Regex میاد).

اعتبارسنجی: بررسی وجود فاصله در ورودی (مثلاً در نام کاربری)

فرض کن داری یه فرم ثبت‌نام طراحی می‌کنی. تو می‌خوای مطمئن بشی که کاربر توی فیلد «نام کاربری» یا «رمز عبور» از هیچ نوع فاصله‌ای استفاده نکرده.

مشکل: چطور چک کنیم که یک رشته حتی یک دونه کاراکتر فضای خالی هم نداشته باشه؟

راه حل Regex: خیلی ساده‌ست! فقط کافیه کل رشته رو برای الگوی s جستجو کنی.

منطق: “اگر تونستی حتی یک مورد مطابق با s توی این رشته پیدا کنی، یعنی این ورودی غیرمجازه.”

مثلاً اگه کاربر نام کاربری “sara_bahrani” رو وارد کنه، جستجوی s هیچ نتیجه‌ای برنمی‌گردونه و ورودی معتبره. اما اگه وارد کنه “sara bahrani”، همون لحظه s اون فاصله وسط رو پیدا می‌کنه و تو می‌تونی به کاربر خطا نمایش بدی که “استفاده از فاصله در نام کاربری مجاز نیست.”

کاربردهای عملی S: استخراج و اعتبارسنجی

اگه s ابزار ما برای حذف کردن و جدا کردن بود، S ابزار ما برای پیدا کردن و نگه داشتن بخش‌های مهم متنه. تو از این دستور استفاده می‌کنی تا مطمئن بشی که “چیزی” در متن وجود داره.

استخراج تمام «توکن‌ها» یا کلمات از یک متن (S+)

این یکی از پایه‌ای‌ترین کاربردهای S هست. فرض کن می‌خوای تمام “چیزهای” معنی‌دار رو از یک متن بیرون بکشی.

مشکل: تو یه جمله داری مثل: “کد تخفیف: SUMMER! (۲۰٪)” و می‌خوای تمام بخش‌های به هم چسبیده رو جدا کنی.

راه حل Regex: تو به موتور Regex می‌گی برو و تمام الگوهای S+ رو برام پیدا کن (Find All).

S یعنی: هر کاراکتری که فاصله، تب یا خط جدید نیست.

+ یعنی: “یک یا چندتا” از الگوی قبلی.

S+ در نتیجه یعنی: “دنبال رشته‌هایی از کاراکترهای غیر-فضای خالی بگرد که پشت سر هم اومدن.”

نتیجه چه خواهد بود؟ Regex می‌گرده و این موارد رو به عنوان “توکن” (Token) پیدا می‌کنه:

“کد”

“تخفیف:” (توجه کن که : هم جزو S هست)

“SUMMER!” (علامت ! هم هست)

“(۲۰٪)” (پرانتزها و درصد هم هستن)

این روش با split کردن فرق داره. در split تو جداکننده‌ها (فضاها) رو حذف می‌کردی، اما اینجا تو داری مستقیماً خود “توکن‌ها” (کلمات و نمادهای چسبیده بهشون) رو استخراج می‌کنی.

اعتبارسنجی: اطمینان از اینکه یک رشته خالی نیست (حداقل یک S دارد)

این یه تکنیک حیاتی برای اعتبارسنجی فرم‌هاست. خیلی وقت‌ها کاربر یه فیلد رو خالی می‌ذاره، یا بدتر، چندتا اسپیس یا تب می‌زنه و دکمه ارسال رو می‌زنه.

مشکل: چطور مطمئن بشی رشته‌ای که کاربر وارد کرده، “واقعاً” خالی نیست و حداقل یک کاراکتر معنی‌دار (حرف، عدد، نماد) توش وجود داره؟

راه حل Regex: خیلی ساده! فقط کافیه کل رشته رو برای الگوی S جستجو کنی.

منطق:

اگه کاربر رشته‌ی “” (خالی) رو بفرسته، S چیزی پیدا نمی‌کنه.

اگه کاربر رشته‌ی ” ” (پر از فاصله و تب) رو بفرسته، S باز هم چیزی پیدا نمی‌کنه (چون همه‌شون s هستن).

اما به محض اینکه کاربر حتی یک کاراکter غیر-فضای خالی وارد کنه، مثلاً ” . ” (یه نقطه وسط دوتا فاصله)، الگوی S اون نقطه رو پیدا می‌کنه و تو می‌فهمی که این فیلد “واقعاً” خالی نیست و محتوا داره.

این روش خیلی قوی‌تر از چک کردن طول رشته (length > 0) هست، چون رشته‌ی ” ” طولش 3 هست ولی از نظر محتوایی کاملاً بی‌ارزشه.

پیدا کردن خطاهایی که در آن فاصله وجود ندارد (مثلاً WordWord به جای Word Word)

این یه کاربرد هوشمندانه‌تره که توی تمیز کردن داده‌های متنی (Data Cleansing) خیلی به دردت می‌خوره. گاهی وقت‌ها، به خصوص موقع کپی/پیست کردن یا ورود سریع داده، فاصله‌ها جا می‌افتن.

مشکل: تو متنی داری که توش خطاهایی مثل “سلامخوبی” یا “کدکالا” یا “MyName” (به جای My Name) وجود داره.

راه حل Regex: تو مستقیماً دنبال خود این خطاها نمی‌گردی، بلکه از S برای شناسایی الگوهای مشکوک استفاده می‌کنی.

اول با S+ تمام “توکن‌ها” رو استخراج می‌کنی (همونطور که بالا گفتیم).

حالا روی این توکن‌ها یه فیلتر Regex دیگه اجرا می‌کنی تا الگوهای مشکوک رو پیدا کنی.

مثال: تو می‌دونی که در حالت عادی، یه کلمه فارسی نباید بلافاصله بعد از یه حرف کوچیک انگلیسی بیاد. پس می‌تونی دنبال توکن‌هایی بگردی که این الگو رو دارن: [a-z][ا-ی] (یک حرف کوچک انگلیسی و بلافاصله یک حرف فارسی). یا مثلاً می‌خوای کلماتی مثل “WordWord” رو پیدا کنی که دو حرف بزرگ وسط کلمه دارن (جایی که باید فاصله می‌بود). می‌تونی دنبال توکنی بگردی که الگوی [a-z][A-Z] رو داشته باشه (یک حرف کوچک و بلافاصله یک حرف بزرگ).

S در اینجا به تو کمک می‌کنه اول “کلمه‌ها” رو (بدون توجه به اینکه درستن یا غلط) جدا کنی، و بعد روی اون‌ها دنبال الگوهای خطا بگردی.

مقایسه s و S: چه زمانی از کدام استفاده کنیم؟

بیا یه قانون کلی برات بگم که کارت رو راحت کنه:

از s(فضای خالی) استفاده کن، وقتی که جداکننده‌ها و فضاها برات مهمن.

کی؟ موقعی که می‌خوای متن رو جدا (Split) کنی، تمیز (Trim) کنی، یا مطمئن بشی فاصله‌ی اضافی وجود نداره. تمرکز تو روی “هیچی”‌هاست.

از S(غیر-فضای خالی) استفاده کن، وقتی که خود محتوا برات مهمه.

کی؟ موقعی که می‌خوای کلمات، اعداد یا توکن‌ها رو استخراج (Find all) کنی، یا مطمئن بشی که فیلد ورودی “واقعاً” محتوایی داره. تمرکز تو روی “چیز”‌هاست.

یه مثال ساده: اگه یه متن مثل “کد: ۱۲۳” داری:

s فقط اون فاصله بین “:” و “۱۲۳” رو پیدا می‌کنه.

S می‌ره و “کد:” و “۱۲۳” رو برات پیدا می‌کنه.

s+ در برابر S+: یافتن فاصله‌ها در برابر یافتن محتوا

این مقایسه، هسته‌ی اصلی تفاوت این دوتاست. جفتشون از + (یک یا چندتا) استفاده می‌کنن، اما هدفشون کاملاً متفاوته.

s+ (یک یا چند فضای خالی پشت سر هم):

کاربرد اصلی: پیدا کردن مرز بین کلمات.

استفاده در عمل: تو معمولاً از این الگو به عنوان جداکننده (Delimiter) در تابع split استفاده می‌کنی.

مثال: وقتی به تابع split می‌گی رشته‌ی “سلام خوبی؟” رو بر اساس s+ جدا کن، اون می‌ره فاصله‌ی بین “سلام” و “خوبی؟” رو پیدا می‌کنه، اون رو حذف می‌کنه و دو طرفش رو به تو تحویل می‌ده: [“سلام”, “خوبی؟”].

S+ (یک یا چند کاراکتر غیر-فضای خالی پشت سر هم):

کاربرد اصلی: پیدا کردن خود کلمات یا توکن‌ها.

استفاده در عمل: تو معمولاً از این الگو در تابع findall (پیدا کردن همه) استفاده می‌کنی.

مثال: وقتی به تابع findall می‌گی تمام الگوهای S+ رو در رشته‌ی “سلام خوبی؟” پیدا کن، اون می‌ره و مستقیماً خود کلمات رو برات استخراج می‌کنه: [“سلام”, “خوبی؟”].

جدول مقایسه سریع:

الگو کاری که انجام می‌ده کاربرد اصلی مثال در “کد: ۱۲۳”
s+ تمام فاصله‌های پشت سر هم رو پیدا می‌کنه. split (شکستن رشته) (فاصله)
S+ تمام کلمات/توکن‌های پشت سر هم رو پیدا می‌کنه. findall (استخراج کلمات) [“کد:”, “۱۲۳”]

ترکیب s و S برای تطبیق‌های پیچیده

جادوی واقعی Regex زمانی اتفاق می‌افته که این دوتا رو با هم ترکیب می‌کنی. اینجا می‌تونی ساختار متن رو بهش دیکته کنی.

مثال ۱: استخراج جفت‌های کلید/مقدار (Key/Value)

فرض کن یه متن داری: “نام: سارا سن: ۳۰” و می‌خوای همه‌ی کلیدها و مقدارها رو جدا کنی.

مشکل: می‌خوای الگویی پیدا کنی که شبیه (یک‌کلمه) و بعد (فاصله) و بعد (یک‌کلمه دیگه) باشه.

راه حل Regex: (S+)s+(S+)

تحلیل الگو:

(S+): گروه اول رو پیدا کن (هر چیزی که فاصله نیست). این می‌شه کلید تو (مثلاً “نام:”).

s+: حالا هرچقدر فاصله بود رو رد کن (جداکننده).

(S+): گروه دوم رو پیدا کن (هر چیزی که فاصله نیست). این می‌شه مقدار تو (مثلاً “سارا”).

وقتی این الگو رو روی متن اجرا کنی، بهت دو تا نتیجه می‌ده:

گروه ۱: “نام:”، گروه ۲: “سارا”

گروه ۱: “سن:”، گروه ۲: “۳۰”

مثال ۲: اعتبارسنجی فرمت “دو کلمه‌ای” (مثل نام و نام خانوادگی)

می‌خوای مطمئن بشی کاربر دقیقاً دو کلمه وارد کرده، نه یکی، نه سه تا.

مشکل: ورودی باید دقیقاً فرمت Word Space Word رو داشته باشه.

راه حل Regex: ^S+s+S+$

تحلیل الگو:

^: از همون ابتدای رشته شروع کن.

S+: باید با یک کلمه (بدون فاصله) شروع بشه.

s+: بعدش باید یک یا چندتا فاصله بیاد.

S+: بعدش باید یک کلمه دیگه (بدون فاصله) بیاد.

$: و رشته باید دقیقاً همین‌جا تموم بشه.

این الگو رشته‌های “سارا بحرانی” یا “Sara Bahrani” رو قبول می‌کنه، اما رشته‌های “سارا” (به تنهایی) یا “سارا بحرانی عزیزم” (سه کلمه) رو رد می‌کنه.

جمع‌بندی

همونطور که با هم دیدیم، s و S دو تا از پرکاربردترین و پایه‌ای‌ترین دستورها توی دنیای Regex هستن. این دوتا دقیقاً مکمل و نقطه‌ی مقابل هم عمل می‌کنن:

s رو برای پیدا کردن مرزها، جداکننده‌ها و پاکسازی فضاهای خالی به کار ببر.

S رو برای پیدا کردن خود محتوا، استخراج کلمات و اعتبارسنجی ورودی‌ها استفاده کن.

تسلط بر همین دو دستور ساده می‌تونه سرعت و دقت تو رو توی تمیز کردن داده‌ها، نوشتن ریدایرکت‌ها یا اعتبارسنجی فرم‌ها چندین برابر کنه. پس حتماً تمرینشون کن!

اگه سوالی در این مورد یا هر مبحث دیگه‌ای از سئو و محتوا داشتی، من همینجا هستم که کمکت کنم.

سوالات متداول درباره s و S (FAQ)

۱. آیا sفقط معادل دکمه Space (فاصله) است؟

نه! این اشتباه رایجیه. s خیلی قوی‌تره و علاوه بر فاصله (Space)، کاراکترهای دیگه‌ای مثل تب (t)، خط جدید (n) و چند مورد دیگه رو هم شامل می‌شه. اگه می‌خوای فقط و فقط دنبال خود کاراکتر فاصله بگردی، باید توی الگوت مستقیماً از خود فاصله ( ) استفاده کنی، نه از s.

۲. تفاوت sو s+چیست؟

s یعنی دقیقاً یک کاراکتر فضای خالی. اما s+ (به خاطر اون علامت +) یعنی یک یا چندتا کاراکتر فضای خالی پشت سر هم. موقع جدا کردن کلمات (Split) همیشه از s+ استفاده کن تا اگه بین دو کلمه ۵ تا فاصله هم بود، همه‌شون با هم به عنوان یک جداکننده شناخته بشن.

۳. آیا s «نیم‌فاصله» فارسی رو هم پیدا می‌کنه؟

در حالت استاندارد (ASCII)، نه. s استاندارد نیم‌فاصله (ZWNJ) رو به عنوان فضای خالی نمی‌شناسه. در نتیجه، S (برعکسش) اون رو به عنوان یه کاراکتر عادی (مثل حروف) پیدا می‌کنه. برای اینکه Regex نیم‌فاصله رو هم به عنوان فاصله بشناسه، باید حالت Unicode رو توی موتور Regex خودت فعال کنی (مثلاً با فلگ /u در جاوااسکریپت).

۴. چطور می‌تونم چک کنم یه رشته فقط از فضاهای خالی تشکیل شده؟

برای این کار می‌تونی از الگوی ^s+$ استفاده کنی. ^ یعنی “از ابتدای رشته” و $ یعنی “تا انتهای رشته”. این الگو چک می‌کنه که آیا کل رشته از اول تا آخر فقط با یک یا چند کاراکتر فضای خالی پر شده یا نه.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *