| PCRETEST(1) | General Commands Manual | PCRETEST(1) |
نام (NAME)
pcretest - برنامه آزمون برای کتابخانه عبارت باقاعده PCRE
خلاصه دستور (SYNOPSIS)
pcretest [options] [input file [output file]]
pcretest به عنوان یک برنامه آزمایشی برای خود کتابخانه عبارات باقاعده PCRE نوشته شده است، اما همچنین میتواند برای آزمایش و تجربه کار با عبارات باقاعده مورد استفاده قرار گیرد. این سند ویژگیهای این برنامه آزمایشی را توصیف میکند؛ برای جزئیات در مورد خود عبارات باقاعده، به مستندات pcrepattern مراجعه کنید. برای جزئیات در مورد فراخوانیهای توابع کتابخانه PCRE و گزینههای آنها، به مستندات pcreapi ، pcre16 و pcre32 مراجعه نمایید.
ورودی pcretest دنبالهای از الگوهای عبارت باقاعده و رشتههایی است که باید با آنها تطبیق داده شوند، همانطور که در ادامه شرح داده شده است. خروجی نتیجه هر تطابق را نمایش میدهد. گزینهها در خط فرمان و الگوها گزینههای PCRE و دقیقاً آنچه را که در خروجی ظاهر میشود کنترل میکنند.
همانطور که PCRE تکامل یافته است، ویژگیهای مختلف بسیاری را به دست آورده و در نتیجه، pcretest اکنون دارای گزینههای نسبتاً مبهم و تخصصی فراوانی برای آزمایش هر ویژگی ممکن است. برخی از این گزینهها مشخصاً برای استفاده همراه با اسکریپت آزمون و فایلهای داده که به عنوان بخشی از PCRE توزیع میشوند طراحی شدهاند، و بعید است در موارد دیگر کاربرد داشته باشند. همه آنها در اینجا مستند شدهاند، اما بدون توجیه و استدلال چندان.
فرمت دادههای ورودی (INPUT DATA FORMAT)
ورودی pcretest خط به خط پردازش میشود، چه با فراخوانی تابع fgets() کتابخانه C و چه از طریق کتابخانه libreadline (به پایین مراجعه کنید). در محیطهای شبه یونیکس، fgets() با هر بایتی غیر از خط جدید به عنوان کاراکتر داده رفتار میکند. با این حال، در برخی از محیطهای ویندوز کاراکتر ۲۶ (هگز 1A) باعث پایان فوری فایل (EOF) میشود و داده دیگری خوانده نخواهد شد. برای حداکثر سازگاری و قابلیت حمل، بنابراین امنترین کار استفاده تنها از کاراکترهای اسکی (ASCII) در فایلهای ورودی pcretest است.
ورودی با استفاده از توابع رشتهای C پردازش میشود، بنابراین نباید حاوی صفرهای باینری باشد، حتی با اینکه در محیطهای شبه یونیکس، fgets() با هر بایتی غیر از خط جدید به عنوان کاراکتر داده رفتار میکند.
کتابخانههای ۸ بیتی، ۱۶ بیتی و ۳۲ بیتی PCRE (PCRE's 8-BIT, 16-BIT AND 32-BIT LIBRARIES)
از نگارش 8.30، دو کتابخانه مجزای PCRE میتوانند ساخته شوند. نگارش اصلی از رشتههای کاراکتری ۸ بیتی پشتیبانی میکند، در حالی که کتابخانه جدیدتر ۱۶ بیتی از رشتههای کاراکتری کدگذاریشده در واحدهای ۱۶ بیتی پشتیبانی میکند. از نگارش 8.32، کتابخانه سومی میتواند ساخته شود که از رشتههای کاراکتری با کدگذاری در واحدهای ۳۲ بیتی پشتیبانی میکند. برنامه pcretest میتواند برای آزمایش هر سه کتابخانه مورد استفاده قرار گیرد. با این حال، خود این برنامه همچنان یک برنامه ۸ بیتی است که ورودی ۸ بیتی میخواند و خروجی ۸ بیتی مینویسد. هنگام آزمایش کتابخانه ۱۶ بیتی یا ۳۲ بیتی، الگوها و رشتههای داده پیش از ارسال به توابع کتابخانه PCRE، به فرمت ۱۶ بیتی یا ۳۲ بیتی تبدیل میشوند. نتایج برای نمایش خروجی به فرمت ۸ بیتی تبدیل میشوند.
اشاره به توابع و ساختارهایی به شکل pcre[16|32]_xx در ادامه به این معنی است: «pcre_xx هنگام استفاده از کتابخانه ۸ بیتی، pcre16_xx هنگام استفاده از کتابخانه ۱۶ بیتی، یا pcre32_xx هنگام استفاده از کتابخانه ۳۲ بیتی».
گزینههای خط فرمان (COMMAND LINE OPTIONS)
- -8
- اگر کتابخانه ۸ بیتی ساخته شده باشد، این گزینه باعث میشود از آن استفاده شود (این حالت پیشفرض است). اگر کتابخانه ۸ بیتی ساخته نشده باشد، این گزینه موجب خطا میشود.
- -16
- اگر کتابخانه ۱۶ بیتی ساخته شده باشد، این گزینه باعث میشود از آن استفاده شود. اگر فقط کتابخانه ۱۶ بیتی ساخته شده باشد، این حالت پیشفرض است. اگر کتابخانه ۱۶ بیتی ساخته نشده باشد، این گزینه موجب خطا میشود.
- -32
- اگر کتابخانه ۳۲ بیتی ساخته شده باشد، این گزینه باعث میشود از آن استفاده شود. اگر فقط کتابخانه ۳۲ بیتی ساخته شده باشد، این حالت پیشفرض است. اگر کتابخانه ۳۲ بیتی ساخته نشده باشد، این گزینه موجب خطا میشود.
- -b
- طوری عمل میکند که گویی هر الگو دارای تغییردهنده /B (نمایش بایتکد) است؛ فرم داخلی پس از کامپایل در خروجی چاپ میشود.
- -C
- شماره نسخه کتابخانه PCRE و تمام اطلاعات موجود درباره ویژگیهای اختیاری گنجاندهشده را نمایش داده و سپس با کد خروج صفر خارج میشود. تمام گزینههای دیگر نادیده گرفته میشوند.
- -C option
- اطلاعات
مربوط به یک
گزینه خاص
زمان ساخت
را چاپ کرده
و سپس خارج
میشود. این
قابلیت
برای
استفاده در
اسکریپتهایی
مانند RunTest در
نظر گرفته
شده است.
گزینههای
زیر مقدار
را در خروجی
چاپ کرده و
کد خروج را
همانطور
که مشخص شده
تنظیم
میکنند:
ebcdic-nl کد برای LF (= NL) در محیط EBCDIC: 0x15 یا 0x25 0 در صورت استفاده در محیط ASCII کد خروج همیشه 0 است linksize اندازه پیوند داخلی پیکربندیشده (2، 3 یا 4) کد خروج بر روی اندازه پیوند تنظیم میشود newline تنظیم پیشفرض خط جدید: CR, LF, CRLF, ANYCRLF, یا ANY کد خروج همیشه 0 است bsr تنظیم پیشفرض برای آنچه \R تطبیق میدهد: ANYCRLF یا ANY کد خروج همیشه 0 استگزینههای زیر مقدار 1 را برای درست یا 0 را برای نادرست در خروجی چاپ کرده و کد خروج را به همان مقدار تنظیم میکنند:
ebcdic کامپایلشده برای محیط EBCDIC jit پشتیبانی Just-In-Time در دسترس است pcre16 کتابخانه ۱۶ بیتی ساخته شده است pcre32 کتابخانه ۳۲ بیتی ساخته شده است pcre8 کتابخانه ۸ بیتی ساخته شده است ucp پشتیبانی از خصوصیات یونیکد در دسترس است utf پشتیبانی از UTF-8 و/یا UTF-16 و/یا UTF-32 در دسترس استاگر گزینه ناشناختهای داده شود، پیام خطا در خروجی نمایش داده میشود؛ کد خروج 0 است.
- -d
- طوری عمل میکند که گویی هر الگو دارای تغییردهنده /D (اشکالزدایی) است؛ فرم داخلی و اطلاعات مربوط به الگوی کامپایلشده پس از کامپایل در خروجی نمایش داده میشوند؛ گزینه -d معادل -b -i است.
- -dfa
- طوری عمل میکند که گویی هر خط داده حاوی دنباله گریز \D است؛ این امر باعث میشود تابع تطبیق جایگزین، یعنی pcre[16|32]_dfa_exec()، به جای تابع استاندارد pcre[16|32]_exec() استفاده شود (جزئیات بیشتر در ادامه آمده است).
- -help
- خلاصهای کوتاه از این گزینهها را در خروجی چاپ کرده و سپس خارج میشود.
- -i
- طوری عمل میکند که گویی هر الگو دارای تغییردهنده /I است؛ اطلاعات مربوط به الگوی کامپایلشده پس از کامپایل ارائه میشود.
- -M
- طوری عمل میکند که گویی هر خط داده حاوی دنباله گریز \M است؛ این امر باعث میشود PCRE با فراخوانی مکرر pcre[16|32]_exec() با محدودیتهای مختلف، حداقل تنظیمات MATCH_LIMIT و MATCH_LIMIT_RECURSION را کشف کند.
- -m
- اندازه هر الگوی کامپایلشده را پس از کامپایل شدن در خروجی چاپ میکند. این معادل افزودن /M به هر عبارت باقاعده است. اندازه برای هر دو کتابخانه بر حسب بایت ارائه میشود.
- -O
- طوری عمل میکند که گویی هر الگو دارای تغییردهنده /O است، یعنی auto-possessification را برای تمام الگوها غیرفعال میکند.
- -o osize
- تعداد عناصر موجود در بردار خروجی را که هنگام فراخوانی pcre[16|32]_exec() یا pcre[16|32]_dfa_exec() استفاده میشود بر روی osize تنظیم میکند. مقدار پیشفرض 45 است که برای 14 زیرعبارت ضبطکننده برای pcre[16|32]_exec() یا 22 تطابق مختلف برای pcre[16|32]_dfa_exec() کافی است. اندازه بردار میتواند برای فراخوانیهای تطبیق فردی با گنجاندن \O در خط داده تغییر داده شود (به پایین مراجعه کنید).
- -p
- طوری عمل میکند که گویی هر الگو دارای تغییردهنده /P است؛ از رابط کاربری برنامهنویسی پوششی POSIX برای فراخوانی PCRE استفاده میشود. زمانی که -p تنظیم شده باشد هیچیک از گزینههای دیگر هیچ اثری ندارند. این گزینه فقط با کتابخانه ۸ بیتی قابل استفاده است.
- -q
- شماره نسخه pcretest را در ابتدای اجرا نمایش نمیدهد.
- -S size
- در سیستمهای شبه یونیکس، اندازه پشته زمان اجرا را به size مگابایت تنظیم میکند.
- -s یا -s+
- طوری عمل
میکند که
گویی هر
الگو دارای
تغییردهنده
/S است؛ به
بیان دیگر،
هر الگو را
مجبور به
مطالعه
میکند. اگر
از -s+
استفاده
شود، تمام
گزینههای
کامپایل JIT
به pcre[16|32]_study()
ارسال
میشوند که
در صورت در
دسترس
بودن، باعث
راهاندازی
بهینهسازی
Just-In-Time برای هر
دو تطابق
کامل و جزئی
میشود.
گزینههای
خاص
کامپایل JIT
را میتوان
با قرار
دادن یک رقم
در محدوده 1
تا 7 پس از -s+
انتخاب کرد
که
حالتهای
کامپایل JIT
را به شرح
زیر تعیین
میکند:
1 فقط تطابق عادی 2 فقط تطابق جزئی ملایم (soft partial) 3 تطابق عادی و تطابق جزئی ملایم 4 فقط تطابق جزئی سخت (hard partial) 6 تطابق جزئی ملایم و سخت 7 هر سه حالت (پیشفرض)
اگر به جای -s+ از -s++ استفاده شود (با یا بدون رقم بعدی)، هنگامی که کد کامپایلشده JIT در عمل استفاده شده باشد، متن "(JIT)" به اولین خط خروجی پس از یک تطابق یا عدم تطابق اضافه میشود.
توجه داشته باشید که گزینههای الگو میتوانند -s را لغو و بازنویسی کنند، چه با مشخص کردن عدم مطالعه و چه با متوقف کردن کامپایل JIT.
اگر گزینه /I یا /D روی یک الگو وجود داشته باشد (درخواست خروجی درباره الگوی کامپایلشده)، اطلاعات مربوط به نتیجه مطالعه در صورتی که مطالعه تنها ناشی از -s بوده و نه -i و نه -d در خط فرمان وجود نداشته باشند، گنجانده نمیشود. این رفتار به این معنی است که خروجی آزمونهایی که با و بدون -s اجرا میشوند باید یکسان باشد، مگر زمانی که گزینههایی که اطلاعات مربوط به اجرای واقعی یک تطابق را چاپ میکنند تنظیم شده باشند.
گزینههای -M، -t و -tm که اطلاعاتی درباره منابع استفادهشده ارائه میدهند، احتمالاً خروجی متفاوتی با و بدون -s تولید میکنند. خروجی همچنین ممکن است در صورتی که گزینه /C روی یک الگوی فردی وجود داشته باشد متفاوت باشد. این گزینه از فراخوانیها برای ردگیری فرآیند تطبیق استفاده میکند و این ممکن است بین الگوهای مطالعهشده و مطالعهنشده متفاوت باشد. اگر الگو حاوی آیتمهای (*MARK) باشد نیز ممکن است به همین دلیل تفاوتهایی وجود داشته باشد. گزینه خط فرمان -s میتواند برای الگوهای خاصی که هرگز نباید مطالعه شوند لغو شود (به تغییردهنده الگوی /S در ادامه مراجعه کنید).
- -t
- هر فرآیند کامپایل، مطالعه و تطبیق را چندین بار با یک زمانسنج اجرا کرده و زمانهای حاصل را برای هر کامپایل، مطالعه یا تطبیق (بر حسب میلیثانیه) در خروجی چاپ میکند. گزینه -m را همراه با -t تنظیم نکنید، زیرا در این صورت خروجی اندازه را بارها و بارها دریافت خواهید کرد و زمانبندی مخدوش خواهد شد. شما میتوانید با قرار دادن یک عدد پس از -t (به عنوان یک آیتم جداگانه در خط فرمان)، تعداد تکرارهای استفادهشده برای زمانگیری را کنترل کنید. برای مثال، "-t 1000" تعداد 1000 بار تکرار میکند. پیشفرض 500000 بار تکرار است.
- -tm
- این مانند -t است با این تفاوت که تنها مرحله تطبیق را زمانگیری میکند، نه مراحل کامپایل یا مطالعه را.
- -T -TM
- این گزینهها مانند -t و -tm عمل میکنند، اما علاوه بر آن، در پایان اجرا، زمانهای کل برای تمام کامپایلها، مطالعهها و تطابقها در خروجی چاپ میشوند.
توضیحات (DESCRIPTION)
اگر به pcretest دو آرگومان نام فایل داده شود، از اولی میخواند و در دومی مینویسد. اگر فقط یک آرگومان نام فایل به آن داده شود، از آن فایل میخواند و در stdout مینویسد. در غیر این صورت، از stdin خوانده و در stdout مینویسد، و برای هر خط ورودی اعلان (prompt) نمایش میدهد، با استفاده از "re>" برای اعلان عبارات باقاعده و "data>" برای اعلان خطوط داده.
هنگام ساخت pcretest، یک گزینه پیکربندی میتواند مشخص کند که این برنامه باید با کتابخانه libreadline پیوند داده شود. هنگامی که این کار انجام شود، اگر ورودی از یک ترمینال باشد، با استفاده از تابع readline() خوانده میشود. این کار امکانات ویرایش خط و تاریخچه را فراهم میآورد. خروجی گزینه -help بیان میکند که آیا از readline() استفاده خواهد شد یا خیر.
این برنامه هر تعداد مجموعه ورودی را روی یک فایل ورودی واحد پردازش میکند. هر مجموعه با یک عبارت باقاعده شروع میشود، و با هر تعداد خط داده که باید در برابر آن الگو تطبیق داده شوند ادامه مییابد.
هر خط داده به طور جداگانه و مستقل تطبیق داده میشود. اگر میخواهید تطابقهای چندخطی انجام دهید، باید از دنباله گریز \n (یا \r یا \r\n و غیره، بسته به تنظیم خط جدید) در یک خط واحد از ورودی برای کدگذاری دنبالههای خط جدید استفاده کنید. هیچ محدودیتی برای طول خطوط داده وجود ندارد؛ بافر ورودی در صورتی که خیلی کوچک باشد به طور خودکار گسترش مییابد.
یک خط خالی پایان خطوط داده را نشان میدهد که در این نقطه، یک عبارت باقاعده جدید خوانده میشود. عبارات باقاعده محصور در هر جداکننده غیرحرفی-عددی غیر از بکاسلش وارد میشوند، برای مثال:
/(a|bc)x+yz/
فاصله خالی پیش از جداکننده ابتدایی نادیده گرفته میشود. یک عبارت باقاعده ممکن است روی چندین خط ورودی ادامه یابد، که در این حالت کاراکترهای خط جدید درون آن گنجانده میشوند. گنجاندن جداکننده درون الگو از طریق اسکیپ کردن آن امکانپذیر است، برای مثال:
/abc\/def/
اگر چنین کنید، کاراکتر گریز و جداکننده بخشی از الگو را تشکیل میدهند، اما از آنجا که جداکنندهها همیشه غیرحرفی-عددی هستند، این امر بر تفسیر آن اثری نمیگذارد. اگر بلافاصله پس از جداکننده پایانی یک بکاسلش بیاید، به عنوان مثال:
/abc/\
آنگاه یک بکاسلش به انتهای الگو اضافه میشود. این کار برای فراهم کردن راهی جهت آزمایش شرایط خطایی انجام شده است که در صورت خاتمه یافتن یک الگو با بکاسلش رخ میدهد، زیرا:
/abc\/
به عنوان خط اول الگویی تفسیر میشود که با "abc/" شروع میشود و باعث میشود pcretest خط بعدی را به عنوان ادامه عبارت باقاعده بخواند.
تغییردهندههای الگو (PATTERN MODIFIERS)
یک الگو میتواند با هر تعداد تغییردهنده دنبال شود، که بیشتر آنها تککاراکتری هستند، هرچند برخی از آنها میتوانند با کاراکترهای بعدی توصیف شوند. به پیروی از کاربرد پرل (Perl)، در ادامه از اینها به عنوان مثال با عنوان «تغییردهنده /i» یاد میشود، حتی با وجود اینکه جداکننده الگو لزوماً نباید همیشه یک اسلش باشد و هیچ اسلشی نیز هنگام نوشتن تغییردهندهها استفاده نمیشود. فاصله خالی ممکن است بین جداکننده نهایی الگو و اولین تغییردهنده، و بین خود تغییردهندهها ظاهر شود. برای ارجاع، در اینجا فهرستی کامل از تغییردهندهها آورده شده است. آنها در چندین گروه قرار میگیرند که در بخشهای بعدی به تفصیل شرح داده شدهاند.
/8 تنظیم حالت UTF /9 تنظیم PCRE_NEVER_UTF (مسدود کردن حالت UTF) /? غیرفعال کردن بررسی اعتبار UTF /+ نمایش باقیمانده رشته هدف پس از تطابق /= نمایش تمام موارد ضبطشده (نه فقط مواردی که مقدار دارند) /A تنظیم PCRE_ANCHORED /B نمایش کد کامپایلشده /C تنظیم PCRE_AUTO_CALLOUT /D همان /B به علاوه /I /E تنظیم PCRE_DOLLAR_ENDONLY /F معکوس کردن ترتیب بایتها در الگوی کامپایلشده /f تنظیم PCRE_FIRSTLINE /G یافتن تمام تطابقها (کوتاه کردن رشته) /g یافتن تمام تطابقها (استفاده از startoffset) /I نمایش اطلاعات درباره الگو /i تنظیم PCRE_CASELESS /J تنظیم PCRE_DUPNAMES /K نمایش نامهای کنترل پسگرد /L تنظیم محلیسازی (locale) /M نمایش اندازه حافظه کامپایلشده /m تنظیم PCRE_MULTILINE /N تنظیم PCRE_NO_AUTO_CAPTURE /O تنظیم PCRE_NO_AUTO_POSSESS /P استفاده از پوشش POSIX /Q آزمایش تابع خارجی بررسی پشته /S مطالعه الگو پس از کامپایل /s تنظیم PCRE_DOTALL /T انتخاب جداول کاراکتری /U تنظیم PCRE_UNGREEDY /W تنظیم PCRE_UCP /X تنظیم PCRE_EXTRA /x تنظیم PCRE_EXTENDED /Y تنظیم PCRE_NO_START_OPTIMIZE /Z عدم نمایش طولها در خروجی /B /<any> تنظیم PCRE_NEWLINE_ANY /<anycrlf> تنظیم PCRE_NEWLINE_ANYCRLF /<cr> تنظیم PCRE_NEWLINE_CR /<crlf> تنظیم PCRE_NEWLINE_CRLF /<lf> تنظیم PCRE_NEWLINE_LF /<bsr_anycrlf> تنظیم PCRE_BSR_ANYCRLF /<bsr_unicode> تنظیم PCRE_BSR_UNICODE /<JS> تنظیم PCRE_JAVASCRIPT_COMPAT
تغییردهندههای سازگار با پرل (Perl-compatible modifiers)
تغییردهندههای /i، /m، /s و /x هنگام فراخوانی pcre[16|32]_compile() به ترتیب گزینههای PCRE_CASELESS، PCRE_MULTILINE، PCRE_DOTALL یا PCRE_EXTENDED را تنظیم میکنند. این چهار حرف تغییردهنده همان تأثیری را دارند که در پرل دارند. برای مثال:
/caseless/i
تغییردهندهها برای سایر گزینههای PCRE (Modifiers for other PCRE options)
جدول زیر تغییردهندههای اضافی را برای تنظیم گزینههای زمان کامپایل PCRE نشان میدهد که با موردی در پرل مطابقت ندارند:
/8 PCRE_UTF8 ) هنگام استفاده از کتابخانه /? PCRE_NO_UTF8_CHECK ) ۸ بیتی /8 PCRE_UTF16 ) هنگام استفاده از کتابخانه /? PCRE_NO_UTF16_CHECK ) ۱۶ بیتی /8 PCRE_UTF32 ) هنگام استفاده از کتابخانه /? PCRE_NO_UTF32_CHECK ) ۳۲ بیتی /9 PCRE_NEVER_UTF /A PCRE_ANCHORED /C PCRE_AUTO_CALLOUT /E PCRE_DOLLAR_ENDONLY /f PCRE_FIRSTLINE /J PCRE_DUPNAMES /N PCRE_NO_AUTO_CAPTURE /O PCRE_NO_AUTO_POSSESS /U PCRE_UNGREEDY /W PCRE_UCP /X PCRE_EXTRA /Y PCRE_NO_START_OPTIMIZE /<any> PCRE_NEWLINE_ANY /<anycrlf> PCRE_NEWLINE_ANYCRLF /<cr> PCRE_NEWLINE_CR /<crlf> PCRE_NEWLINE_CRLF /<lf> PCRE_NEWLINE_LF /<bsr_anycrlf> PCRE_BSR_ANYCRLF /<bsr_unicode> PCRE_BSR_UNICODE /<JS> PCRE_JAVASCRIPT_COMPAT
تغییردهندههایی که در براکتهای گوشهدار محصور شدهاند رشتههای لفظی هستند همانطور که نشان داده شده است، از جمله خود براکتها، اما حروف درون آنها میتواند با هر دو حالت کوچک یا بزرگ باشد. این مثال تطابق چندخطی را با CRLF به عنوان دنباله پایان خط تنظیم میکند:
/^abc/m<CRLF>
علاوه بر فعال کردن گزینه PCRE_UTF8/16/32، تغییردهنده /8 باعث میشود تمام کاراکترهای غیرقابل چاپ در رشتههای خروجی با استفاده از نمادگذاری \x{hh...} چاپ شوند. در غیر این صورت، موارد کمتر از 0x100 در مبنای شانزده بدون براکتهای کروشهای چاپ میشوند.
جزئیات کامل گزینههای PCRE در مستندات pcreapi آمده است.
یافتن همه تطابقها در یک رشته (Finding all matches in a string)
جستجو برای تمام تطابقهای ممکن در هر رشته هدف میتواند با تغییردهنده /g یا /G درخواست شود. پس از یافتن یک تطابق، PCRE مجدداً فراخوانی میشود تا باقیمانده رشته هدف را جستجو کند. تفاوت بین /g و /G در این است که اولی از آرگومان startoffset به pcre[16|32]_exec() برای شروع جستجو در یک نقطه جدید در کل رشته استفاده میکند (که در عمل کاری است که پرل انجام میدهد)، در حالی که دومی یک زیررشته کوتاهشده را ارسال میکند. این امر در صورتی که الگو با یک بررسی به عقب (از جمله \b یا \B) شروع شود، در فرآیند تطبیق تفاوت ایجاد میکند.
اگر هر فراخوانی به pcre[16|32]_exec() در یک دنباله /g یا /G با یک رشته خالی تطبیق یابد، فراخوانی بعدی با فلگهای PCRE_NOTEMPTY_ATSTART و PCRE_ANCHORED تنظیمشده انجام میشود تا به دنبال تطابق دیگری و غیرخالی در همان نقطه بگردد. اگر این تطابق دوم ناموفق باشد، آفست شروع به جلو رانده میشود و تطابق عادی مجدداً تلاش میشود. این امر شیوه مدیریت چنین مواردی توسط پرل هنگام استفاده از تغییردهنده /g یا تابع split() را تقلید میکند. به طور عادی، آفست شروع به اندازه یک کاراکتر جلو برده میشود، اما اگر قرارداد خط جدید CRLF را به عنوان یک خط جدید بشناسد و کاراکتر فعلی CR و به دنبال آن LF باشد، پیشروی به اندازه دو کاراکتر استفاده میشود.
سایر تغییردهندهها (Other modifiers)
تغییردهندههای بیشتری نیز برای کنترل شیوه عملکرد pcretest وجود دارند.
تغییردهنده /+ درخواست میکند که علاوه بر چاپ زیررشتهای که با کل الگو تطبیق یافته است، pcretest باید علاوه بر آن باقیمانده رشته هدف را نیز در خروجی نمایش دهد. این برای آزمونهایی که در آنها رشته هدف شامل چندین نسخه از همان زیررشته است مفید است. اگر تغییردهنده + دو بار ظاهر شود، همین عمل برای زیررشتههای ضبطشده نیز انجام میگیرد. در هر مورد، باقیمانده در خط بعدی با یک کاراکتر مثبت به دنبال شماره ضبط چاپ میشود. توجه داشته باشید که این تغییردهنده نباید بلافاصله پس از تغییردهنده /S بیاید زیرا /S+ و /S++ معانی دیگری دارند.
تغییردهنده /= درخواست میکند که مقادیر تمام پرانتزهای بالقوه ضبطشده پس از یک تطابق در خروجی چاپ شوند. به طور پیشفرض، تنها مواردی که تا بالاترین موردی که واقعاً در تطابق استفاده شده است در خروجی نمایش داده میشوند (مربوط به کد برگشتی از pcre[16|32]_exec()). مقادیر در بردار آفستها مربوط به شمارههای بالاتر باید روی -1 تنظیم شوند، و این موارد به عنوان "<unset>" در خروجی نمایش مییابند. این تغییردهنده روشی برای بررسی اینکه آیا این اتفاق میافتد فراهم میکند.
تغییردهنده /B یک ویژگی اشکالزدایی است. این تغییردهنده درخواست میکند که pcretest نمایشی از کد کامپایلشده را پس از کامپایل در خروجی چاپ کند. به طور معمول این اطلاعات شامل مقادیر طول و آفست است؛ با این حال، اگر /Z نیز وجود داشته باشد، این دادهها با فاصلهها جایگزین میشوند. این یک ویژگی ویژه برای استفاده در اسکریپتهای آزمون خودکار است؛ این ویژگی اطمینان میدهد که خروجی یکسانی برای اندازههای مختلف پیوند داخلی تولید میشود.
تغییردهنده /D یک ویژگی اشکالزدایی PCRE است و معادل /BI است، یعنی هر دو تغییردهنده /B و /I.
تغییردهنده /F باعث میشود که pcretest ترتیب بایتهای فیلدهای ۲ بایتی و ۴ بایتی را در الگوی کامپایلشده معکوس کند. این قابلیت برای آزمایش قابلیتی در PCRE است که به آن اجازه میدهد الگوهایی را که در میزبانی با اندیاننس (ترتیب بایت) متفاوت کامپایل شدهاند اجرا کند. این قابلیت زمانی که از رابط POSIX برای PCRE استفاده میشود، یعنی زمانی که تغییردهنده الگوی /P مشخص شده باشد، در دسترس نیست. همچنین به بخش مربوط به ذخیره و بارگذاری مجدد الگوهای کامپایلشده در زیر مراجعه کنید.
تغییردهنده /I درخواست میکند که pcretest اطلاعات مربوط به الگوی کامپایلشده را چاپ کند (اینکه آیا مهار شده است، دارای یک کاراکتر اول ثابت است، و غیره). این کار را با فراخوانی pcre[16|32]_fullinfo() پس از کامپایل یک الگو انجام میدهد. اگر الگو مطالعه شده باشد، نتایج آن نیز در خروجی نمایش داده میشوند. در این خروجی، کلمه "char" به معنای یک کاراکتر غیر UTF است، یعنی مقدار یک آیتم داده واحد (۸ بیتی، ۱۶ بیتی یا ۳۲ بیتی، بسته به کتابخانهای که آزمایش میشود).
تغییردهنده /K از pcretest میخواهد نامهای حاصل از افعال کنترلی پسگرد را که از فراخوانیهای pcre[16|32]_exec() بازگردانده میشوند نمایش دهد. این امر باعث میشود pcretest یک بلوک pcre[16|32]_extra ایجاد کند اگر قبلاً توسط فراخوانی به pcre[16|32]_study() ایجاد نشده باشد، و فلگ PCRE_EXTRA_MARK و فیلد mark درون آن را در هر بار فراخوانی pcre[16|32]_exec() تنظیم نماید. اگر متغیری که فیلد mark به آن اشاره میکند برای یک تطابق، عدم تطابق یا تطابق جزئی غیر NULL باشد، pcretest رشتهای را که به آن اشاره میکند چاپ میکند. برای یک تطابق، این در یک خط جداگانه با برچسب "MK:" نمایش داده میشود. برای یک عدم تطابق، به پیام اضافه میشود.
تغییردهنده /L باید مستقیماً با نام یک محلیسازی دنبال شود، برای مثال:
/pattern/Lfr_FR
به همین دلیل، باید آخرین تغییردهنده باشد. محلیسازی دادهشده تنظیم میشود، pcre[16|32]_maketables() برای ساخت مجموعهای از جداول کاراکتری برای آن محلیسازی فراخوانی میشود، و سپس هنگام کامپایل عبارت باقاعده به pcre[16|32]_compile() ارسال میگردد. بدون تغییردهنده /L (یا /T)، مقدار NULL به عنوان اشارهگر جداول ارسال میشود؛ یعنی /L فقط برای عبارتی که روی آن ظاهر میشود اعمال میگردد.
تغییردهنده /M باعث میشود اندازه بر حسب بایت بلوک حافظه استفادهشده برای نگهداری الگوی کامپایلشده در خروجی چاپ شود. این شامل اندازه بلوک pcre[16|32] نمیشود؛ تنها دادههای کامپایلشده واقعی است. اگر الگو با موفقیت با گزینه PCRE_STUDY_JIT_COMPILE مطالعه شود، اندازه کد کامپایلشده JIT نیز نمایش داده میشود.
تغییردهنده /Q برای آزمایش استفاده از pcre_stack_guard استفاده میشود. این تغییردهنده باید با '0' یا '1' دنبال شود که کد برگشتی دادهشده از یک تابع خارجی را مشخص میکند که به PCRE ارسال شده و برای بررسی پشته در طول کامپایل استفاده میشود (برای جزئیات به مستندات pcreapi مراجعه کنید).
تغییردهنده /S باعث میشود pcre[16|32]_study() پس از کامپایل شدن عبارت فراخوانی شود و نتایج هنگام تطبیق عبارت مورد استفاده قرار گیرند. تعدادی کاراکتر توصیفکننده وجود دارد که ممکن است پس از /S بیایند. آنها میتوانند به هر ترتیبی ظاهر شوند.
اگر /S با یک علامت تعجب دنبال شود، pcre[16|32]_study() با گزینه PCRE_STUDY_EXTRA_NEEDED فراخوانی میشود و باعث میشود همیشه یک بلوک pcre_extra برگرداند، حتی زمانی که مطالعه اطلاعات مفیدی را کشف نکند.
اگر /S با یک کاراکتر دوم S دنبال شود، مطالعه را متوقف میکند، حتی اگر از خارج توسط گزینه خط فرمان -s درخواست شده باشد. این امر مشخص کردن اینکه الگوهای خاصی همیشه مطالعه شوند و بقیه هرگز مطالعه نشوند را مستقل از -s ممکن میسازد. این ویژگی در فایلهای آزمون در چند مورد که خروجی هنگام مطالعه الگو متفاوت است، استفاده میشود.
اگر تغییردهنده /S با یک کاراکتر + دنبال شود، فراخوانی به pcre[16|32]_study() با تمام گزینههای مطالعه JIT انجام میشود و در صورت در دسترس بودن، پشتیبانی بهینهسازی Just-In-Time را برای هر دو تطابق عادی و جزئی درخواست میکند. اگر میخواهید حالتهای کامپایل JIT را محدود کنید، میتوانید پس از /S+ یک رقم در محدوده 1 تا 7 قرار دهید:
1 فقط تطابق عادی 2 فقط تطابق جزئی ملایم 3 تطابق عادی و تطابق جزئی ملایم 4 فقط تطابق جزئی سخت 6 تطابق جزئی ملایم و سخت 7 هر سه حالت (پیشفرض)
اگر به جای /S+ از /S++ استفاده شود (با یا بدون رقم بعدی)، هنگامی که کد کامپایلشده JIT واقعاً استفاده شده باشد، متن "(JIT)" به اولین خط خروجی پس از یک تطابق یا عدم تطابق اضافه میشود.
توجه داشته باشید که یک تغییردهنده مستقل /+ نیز وجود دارد؛ این نباید بلافاصله پس از /S یا /S+ قرار گیرد زیرا دچار تفسیر نادرست خواهد شد.
اگر مطالعه JIT موفقیتآمیز باشد، کد کامپایلشده JIT به طور خودکار هنگام اجرای pcre[16|32]_exec() استفاده خواهد شد، به جز مواردی که گزینههای زمان اجرای ناسازگار مشخص شده باشند. برای جزئیات بیشتر، به مستندات pcrejit مراجعه فرمایید. همچنین به دنباله گریز \J در زیر برای روشی جهت تعیین اندازه پشته JIT نگاه کنید.
در نهایت، اگر /S با یک کاراکتر منها دنبال شود، کامپایل JIT متوقف میشود، حتی اگر از خارج توسط گزینه خط فرمان -s درخواست شده باشد. این امر مشخص کردن اینکه JIT هرگز نباید برای الگوهای خاصی استفاده شود را ممکن میسازد.
تغییردهنده /T باید با یک رقم منفرد دنبال شود. این امر باعث میشود مجموعه خاصی از جداول کاراکتری توکار به pcre[16|32]_compile() ارسال شود. این در آزمونهای استاندارد PCRE برای بررسی رفتار با جداول کاراکتری مختلف استفاده میشود. این رقم جداول را به شرح زیر مشخص میکند:
0 جداول پیشفرض ASCII، همانطور که در
pcre_chartables.c.dist توزیع شده است
1 مجموعهای از جداول که کاراکترهای ISO 8859 را تعریف میکنند
در جدول 1، برخی از کاراکترهایی که کدهای آنها بزرگتر از 128 است به عنوان حروف، ارقام، فاصلهها و غیره شناسایی میشوند.
استفاده از رابط کاربری برنامهنویسی پوششی POSIX (Using the POSIX wrapper API)
تغییردهنده /P باعث میشود pcretest کتابخانه PCRE را به جای رابط برنامهنویسی بومی آن، از طریق رابط کاربری برنامهنویسی پوششی POSIX فراخوانی کند. این تنها از کتابخانه ۸ بیتی پشتیبانی میکند. هنگامی که /P تنظیم شده باشد، تغییردهندههای زیر گزینهها را برای تابع regcomp() تنظیم میکنند:
/i REG_ICASE /m REG_NEWLINE /N REG_NOSUB /s REG_DOTALL ) /U REG_UNGREEDY ) این گزینهها بخشی از /W REG_UCP ) استاندارد POSIX نیستند /8 REG_UTF8 )
تغییردهنده /+ همانطور که در بالا شرح داده شد کار میکند. تمام تغییردهندههای دیگر نادیده گرفته میشوند.
مسدود کردن برخی تغییردهندهها (Locking out certain modifiers)
کتابخانه PCRE میتواند با یا بدون پشتیبانی از ویژگیهای خاصی مانند UTF-8/16/32 یا خصوصیات یونیکد کامپایل شود. بر این اساس، آزمونهای استاندارد به تعدادی فایل مختلف تقسیم میشوند که برای اجرا بر اساس ویژگیهای در دسترس انتخاب میشوند. هنگام بهروزرسانی آزمونها، بسیار آسان است که یک آزمون جدید به اشتباه در فایل نادرستی قرار داده شود؛ به عنوان مثال، قرار دادن آزمونی که نیاز به پشتیبانی UTF دارد در فایلی که در صورت عدم در دسترس بودن آن استفاده میشود. برای کمک به تشخیص زودهنگام چنین اشتباهاتی، قابلیتی برای مسدود کردن تغییردهندههای خاص وجود دارد. اگر یک خط ورودی برای pcretest با رشته "< forbid " شروع شود، دنباله کاراکترهای بعدی به عنوان فهرستی از تغییردهندههای ممنوعه در نظر گرفته میشود. به عنوان مثال، در فایلهای آزمونی که نباید از پشتیبانی UTF یا خصوصیات یونیکد استفاده کنند، این خط ظاهر میشود:
< forbid 8W
این امر تغییردهندههای /8 و /W را مسدود میکند. اگر در ادامه با آنها مواجه شود، بلافاصله یک خطا رخ میدهد. اگر رشته کاراکتری حاوی < باشد اما > نداشته باشد، تمام تغییردهندههای چندکاراکتری که با < شروع میشوند مسدود میشوند. در غیر این صورت، چنین تغییردهندههایی باید به طور صریح فهرست شوند، برای مثال:
< forbid <JS><cr>
باید یک فاصله منفرد بین < و "forbid" وجود داشته باشد تا این قابلیت شناسایی شود. اگر وجود نداشته باشد، خط یا به عنوان درخواستی برای بارگذاری مجدد یک الگوی از پیش کامپایلشده تفسیر میشود (به بخش "ذخیره و بارگذاری مجدد الگوهای کامپایلشده" در زیر مراجعه کنید) یا اگر کاراکتر < دیگری وجود داشته باشد، به عنوان الگویی تفسیر میشود که از < به عنوان جداکننده خود استفاده میکند.
خطوط داده (DATA LINES)
قبل از اینکه هر خط داده به pcre[16|32]_exec() ارسال شود، فاصلههای خالی ابتدایی و انتهایی حذف شده و سپس برای دنبالههای گریز \ اسکن میشود. برخی از اینها ویژگیهای بسیار تخصصی هستند که برای بررسی برخی از ویژگیهای پیچیدهتر PCRE در نظر گرفته شدهاند. اگر فقط در حال آزمایش عبارات باقاعده "عادی" هستید، احتمالاً به هیچیک از اینها نیاز ندارید. دنبالههای گریز زیر شناسایی میشوند:
\a زنگ اخطار (BEL, \x07)
\b فاصلهبرگردان (backspace, \x08)
\e گریز (escape, \x27)
\f برگهبر (form feed, \x0c)
\n خط جدید (newline, \x0a)
\qdd تنظیم محدودیت PCRE_MATCH_LIMIT به dd
(هر تعداد رقم)
\r بازگشت به ابتدای سطر (carriage return, \x0d)
\t تب افقی (tab, \x09)
\v تب عمودی (vertical tab, \x0b)
\nnn کاراکتر در مبنای هشت (تا 3 رقم هشتهشتی)؛ همیشه
یک بایت مگر در صورت بزرگتر از 255 بودن در حالت UTF-8 یا ۱۶ بیتی یا ۳۲ بیتی
\o{dd...} کاراکتر در مبنای هشت (هر تعداد رقم هشتهشتی)
\xhh بایت در مبنای شانزده (تا 2 رقم هگزادسیمال)
\x{hh...} کاراکتر در مبنای شانزده (هر تعداد رقم هگزادسیمال)
\A ارسال گزینه PCRE_ANCHORED به pcre[16|32]_exec()
یا pcre[16|32]_dfa_exec()
\B ارسال گزینه PCRE_NOTBOL به pcre[16|32]_exec()
یا pcre[16|32]_dfa_exec()
\Cdd فراخوانی pcre[16|32]_copy_substring() برای زیررشته dd
پس از یک تطابق موفق (عدد کمتر از 32)
\Cname فراخوانی pcre[16|32]_copy_named_substring() برای زیررشته
"name" پس از یک تطابق موفق (نام با کاراکتر
غیر حرفی-عددی بعدی خاتمه مییابد)
\C+ نمایش زیررشتههای ضبطشده فعلی در زمان فراخوانی
\C- عدم ارائه تابع فراخوانی
\C!n بازگرداندن 1 به جای 0 هنگام رسیدن به
فراخوانی شماره n
\C!n!m بازگرداندن 1 به جای 0 هنگام رسیدن به فراخوانی
شماره n برای mامین بار
\C*n ارسال عدد n (میتواند منفی باشد) به عنوان داده فراخوانی؛
این به عنوان مقدار بازگشتی فراخوانی استفاده میشود
\D استفاده از تابع تطبیق pcre[16|32]_dfa_exec()
\F فقط کوتاهترین تطابق برای pcre[16|32]_dfa_exec()
\Gdd فراخوانی pcre[16|32]_get_substring() برای زیررشته dd
پس از یک تطابق موفق (عدد کمتر از 32)
\Gname فراخوانی pcre[16|32]_get_named_substring() برای زیررشته
"name" پس از یک تطابق موفق (نام با کاراکتر
غیر حرفی-عددی بعدی خاتمه مییابد)
\Jdd راهاندازی پشته JIT حداکثر با dd کیلوبایت (هر
تعداد رقم)
\L فراخوانی pcre[16|32]_get_substringlist() پس از
یک تطابق موفق
\M کشف حداقل تنظیمات MATCH_LIMIT و
MATCH_LIMIT_RECURSION
\N ارسال گزینه PCRE_NOTEMPTY به pcre[16|32]_exec()
یا pcre[16|32]_dfa_exec()؛ در صورت استفاده دو بار، ارسال
گزینه PCRE_NOTEMPTY_ATSTART
\Odd تنظیم اندازه بردار خروجی ارسالی به
pcre[16|32]_exec() به dd (هر تعداد رقم)
\P ارسال گزینه PCRE_PARTIAL_SOFT به pcre[16|32]_exec()
یا pcre[16|32]_dfa_exec()؛ در صورت استفاده دو بار، ارسال
گزینه PCRE_PARTIAL_HARD
\Qdd تنظیم محدودیت PCRE_MATCH_LIMIT_RECURSION به dd
(هر تعداد رقم)
\R ارسال گزینه PCRE_DFA_RESTART به pcre[16|32]_dfa_exec()
\S نمایش جزئیات فراخوانیهای get/free حافظه در طول تطبیق
\Y ارسال گزینه PCRE_NO_START_OPTIMIZE به pcre[16|32]_exec()
یا pcre[16|32]_dfa_exec()
\Z ارسال گزینه PCRE_NOTEOL به pcre[16|32]_exec()
یا pcre[16|32]_dfa_exec()
\? ارسال گزینه PCRE_NO_UTF[8|16|32]_CHECK به
pcre[16|32]_exec() یا pcre[16|32]_dfa_exec()
\>dd شروع تطابق در آفست dd (اختیاری "-"؛ سپس
هر تعداد رقم)؛ این آرگومان startoffset را برای
pcre[16|32]_exec() یا pcre[16|32]_dfa_exec() تنظیم میکند
\<cr> ارسال گزینه PCRE_NEWLINE_CR به pcre[16|32]_exec()
یا pcre[16|32]_dfa_exec()
\<lf> ارسال گزینه PCRE_NEWLINE_LF به pcre[16|32]_exec()
یا pcre[16|32]_dfa_exec()
\<crlf> ارسال گزینه PCRE_NEWLINE_CRLF به pcre[16|32]_exec()
یا pcre[16|32]_dfa_exec()
\<anycrlf> ارسال گزینه PCRE_NEWLINE_ANYCRLF به pcre[16|32]_exec()
یا pcre[16|32]_dfa_exec()
\<any> ارسال گزینه PCRE_NEWLINE_ANY به pcre[16|32]_exec()
یا pcre[16|32]_dfa_exec()
استفاده از \x{hh...} وابسته به استفاده از تغییردهنده /8 روی الگو نیست. این دنباله همیشه شناخته میشود. ممکن است هر تعداد رقم هگزادسیمال درون براکتها وجود داشته باشد؛ مقادیر نامعتبر پیام خطا ایجاد میکنند.
توجه داشته باشید که \xhh به جای یک کاراکتر، یک بایت را در حالت UTF-8 مشخص میکند؛ این امر ساخت دنبالههای نامعتبر UTF-8 را برای اهداف آزمایشی امکانپذیر میسازد. از سوی دیگر، \x{hh} در حالت UTF-8 به عنوان یک کاراکتر UTF-8 تفسیر میشود، و اگر مقدار آن بزرگتر از 127 باشد بیش از یک بایت تولید میکند. هنگام آزمایش کتابخانه ۸ بیتی در حالتی غیر از UTF-8، دنباله \x{hh} برای مقادیر کمتر از 256 یک بایت تولید میکند و برای مقادیر بزرگتر منجر به خطا میشود.
در حالت UTF-16، تمام مقادیر ۴ رقمی \x{hhhh} پذیرفته میشوند. این امر ساخت دنبالههای نامعتبر UTF-16 را برای اهداف آزمایشی ممکن میسازد.
در حالت UTF-32، تمام مقادیر ۴ تا ۸ رقمی \x{...} پذیرفته میشوند. این امر ساخت دنبالههای نامعتبر UTF-32 را برای اهداف آزمایشی ممکن میسازد.
دنبالههای گریزی که دنبالههای پایان خط را مشخص میکنند، دقیقاً همانطور که نشان داده شده رشتههای لفظی هستند. نباید بیش از یک تنظیم خط جدید در هیچ خط دادهای وجود داشته باشد.
یک بکاسلش که به دنبال آن هر چیز دیگری بیاید، فقط آن چیز دیگر را اسکیپ میکند. اگر آخرین کاراکتر یک بکاسلش باشد، نادیده گرفته میشود. این امر راهی برای ارسال یک خط خالی به عنوان داده فراهم میکند، زیرا یک خط واقعاً خالی به ورودی داده پایان میدهد.
دنباله گریز \J روشی برای تنظیم حداکثر اندازه پشته که توسط کد بهینهسازی Just-In-Time استفاده میشود فراهم میکند. در صورتی که بهینهسازی JIT استفاده نشود نادیده گرفته میشود. فراهم کردن پشتهای بزرگتر از پیشفرض 32K فقط برای الگوهای بسیار پیچیده ضروری است.
اگر \M وجود داشته باشد، pcretest تابع pcre[16|32]_exec() را چندین بار، با مقادیر مختلف در فیلدهای match_limit و match_limit_recursion ساختار داده pcre[16|32]_extra فراخوانی میکند، تا زمانی که حداقل اعداد را برای هر پارامتر بیابد که اجازه دهد pcre[16|32]_exec() بدون خطا کامل شود. از آنجا که این ویژگی خاصی از اجرای عادی و تفسیری pcre[16|32]_exec() را آزمایش میکند، استفاده از هرگونه بهینهسازی JIT که ممکن است توسط توصیفکننده /S+ از گزینه -s+ تنظیم شده باشد غیرفعال میشود.
عدد match_limit معیاری از مقدار پسگرد (backtracking) است که رخ میدهد، و بررسی آن میتواند آموزنده باشد. برای بیشتر تطابقهای ساده، این عدد بسیار کوچک است، اما برای الگوهایی با تعداد بسیار زیادی از احتمالات تطبیق، میتواند با افزایش طول رشته هدف به سرعت بسیار بزرگ شود. عدد match_limit_recursion معیاری است از اینکه چه مقدار حافظه پشته (یا در صورتی که PCRE با NO_RECURSE کامپایل شده باشد، حافظه هیپ) برای تکمیل تلاش تطبیق نیاز است.
هنگامی که \O استفاده میشود، مقدار مشخصشده ممکن است بیشتر یا کمتر از اندازه تنظیمشده توسط گزینه خط فرمان -O (یا پیشفرض 45) باشد؛ دنباله \O تنها برای فراخوانی pcre[16|32]_exec() برای خطی که در آن ظاهر شده است اعمال میشود.
اگر تغییردهنده /P روی الگو وجود داشته باشد و باعث استفاده از رابط کاربری پوششی POSIX شود، تنها دنبالههای تنظیم گزینه که دارای اثر هستند \B، \N و \Z هستند که باعث میشوند به ترتیب REG_NOTBOL، REG_NOTEMPTY و REG_NOTEOL به regexec() ارسال شوند.
تابع تطبیق جایگزین (THE ALTERNATIVE MATCHING FUNCTION)
به طور پیشفرض، pcretest از تابع تطبیق استاندارد PCRE، یعنی pcre[16|32]_exec() برای تطبیق هر خط داده استفاده میکند. کتابخانه PCRE همچنین از یک تابع تطبیق جایگزین به نام pcre[16|32]_dfa_exec() پشتیبانی میکند که به شیوهای متفاوت عمل کرده و دارای برخی محدودیتها است. تفاوتهای بین این دو تابع در مستندات pcrematching شرح داده شده است.
اگر یک خط داده حاوی دنباله گریز \D باشد، یا اگر خط فرمان حاوی گزینه -dfa باشد، تابع تطبیق جایگزین استفاده میشود. این تابع تمام تطابقهای ممکن را در یک نقطه معین پیدا میکند. با این حال، اگر دنباله گریز \F در خط داده وجود داشته باشد، پس از یافتن اولین تطابق متوقف میشود. این همیشه کوتاهترین تطابق ممکن است.
خروجی پیشفرض از PCRETEST (DEFAULT OUTPUT FROM PCRETEST)
این بخش خروجی را زمانی که تابع تطبیق عادی، یعنی pcre[16|32]_exec() استفاده میشود توصیف میکند.
هنگامی که یک تطابق با موفقیت انجام میشود، pcretest فهرست زیررشتههای ضبطشدهای را که pcre[16|32]_exec() برمیگرداند چاپ میکند، که با شماره 0 برای رشتهای که با کل الگو تطبیق یافته است آغاز میشود. در غیر این صورت، در صورتی که مقدار بازگشتی PCRE_ERROR_NOMATCH باشد عبارت "No match" را چاپ میکند، و هنگامی که pcre[16|32]_exec() مقدار PCRE_ERROR_PARTIAL را بازگرداند عبارت "Partial match:" به همراه زیررشتهای که به طور جزئی تطبیق یافته است را نمایش میدهد. (توجه داشته باشید که این کل زیررشتهای است که در طول تطابق جزئی بررسی شده است؛ در صورتی که یک بررسی به عقب، \K، \b یا \B درگیر بوده باشد، ممکن است شامل کاراکترهایی قبل از شروع واقعی تطابق باشد). برای هر بازگشت دیگر، pcretest شماره خطای منفی PCRE و یک عبارت توصیفی کوتاه را چاپ میکند. اگر خطا ناشی از شکست در بررسی رشته UTF باشد، آفست ابتدای کاراکتر ناموفق و کد دلیل نیز چاپ میشوند، مشروط بر اینکه اندازه بردار خروجی حداقل دو باشد. در اینجا نمونهای از یک اجرای تعاملی pcretest آورده شده است:
$ pcretest PCRE version 8.13 2011-04-30 re> /^abc(\d+)/ data> abc123 0: abc123 1: 123 data> xyz No match
زیررشتههای ضبطکنندهای که مقداردهی نشدهاند و با زیررشتهای که مقداردهی شده است دنبال نمیشوند، توسط pcre[16|32]_exec() بازگردانده نمیشوند و توسط pcretest نمایش داده نخواهند شد. در مثال زیر، دو زیررشته ضبطکننده وجود دارد، اما هنگامی که اولین خط داده تطبیق مییابد، زیررشته دوم که مقداردهی نشده است نشان داده نمیشود. یک زیررشته مقداردهینشده "داخلی" همانند خط دوم داده به عنوان "<unset>" نمایش داده میشود:
re> /(a)|(b)/ data> a 0: a 1: a data> b 0: b 1: <unset> 2: b
اگر رشتهها حاوی هرگونه کاراکتر غیرقابل چاپ باشند، در صورتی که مقدار کمتر از 256 باشد و حالت UTF تنظیم نشده باشد، به صورت دنبالههای گریز \xhh نمایش مییابند. در غیر این صورت به عنوان دنبالههای گریز \x{hh...} چاپ میشوند. برای تعریف کاراکترهای غیرقابل چاپ به ادامه مراجعه کنید. اگر الگو دارای تغییردهنده /+ باشد، خروجی برای زیررشته 0 با باقیمانده رشته هدف دنبال میشود که با "0+" مشخص میشود، به این صورت:
re> /cat/+ data> cataract 0: cat 0+ aract
اگر الگو دارای تغییردهنده /g یا /G باشد، نتایج تلاشهای متوالی برای تطابق به ترتیب چاپ میشوند، مانند این:
re> /\Bi(\w\w)/g data> Mississippi 0: iss 1: ss 0: iss 1: ss 0: ipp 1: pp
عبارت "No match" تنها در صورتی چاپ میشود که اولین تلاش برای تطابق ناموفق باشد. در اینجا نمونهای از یک پیام شکست آورده شده است (آفست 4 که توسط \>4 مشخص شده است فراتر از انتهای رشته هدف است):
re> /xyz/ data> xyz\>4 Error -24 (bad offset value)
اگر هر یک از دنبالههای \C، \G یا \L در یک خط داده که با موفقیت تطبیق یافته است وجود داشته باشد، زیررشتههای استخراجشده توسط توابع کمکی به جای دونقطه با C، G یا L پس از شماره رشته در خروجی چاپ میشوند. این علاوه بر فهرست کامل عادی است. طول رشته (یعنی مقدار برگشتی از تابع استخراج) در پرانتز پس از هر رشته برای \C و \G آورده میشود.
توجه داشته باشید در حالی که الگوها میتوانند روی چندین خط ادامه یابند (یک اعلان ساده ">" برای ادامهها استفاده میشود)، خطوط داده نمیتوانند چنین باشند. با این حال خطوط جدید میتوانند با استفاده از دنباله گریز \n (یا \r، \r\n و غیره، بسته به تنظیم دنباله خط جدید) در دادهها گنجانده شوند.
خروجی از تابع تطبیق جایگزین (OUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION)
هنگامی که تابع تطبیق جایگزین، یعنی pcre[16|32]_dfa_exec() استفاده میشود (از طریق دنباله گریز \D یا گزینه خط فرمان -dfa)، خروجی شامل فهرستی از تمام تطابقهایی است که از اولین نقطه در رشته هدف که حداقل یک تطابق در آن وجود دارد شروع میشوند. برای مثال:
re> /(tang|tangerine|tan)/ data> yellow tangerine\D 0: tangerine 1: tang 2: tan
(استفاده از تابع تطبیق عادی روی این داده تنها "tang" را پیدا میکند). طولانیترین رشته تطبیقیافته همیشه در ابتدا آورده میشود (و شماره صفر به آن اختصاص مییابد). پس از یک بازگشت PCRE_ERROR_PARTIAL، خروجی عبارت "Partial match:" به همراه زیررشتهای است که به طور جزئی تطبیق یافته است. (توجه داشته باشید که این کل زیررشتهای است که در طول تطابق جزئی بررسی شده است؛ در صورتی که یک بررسی به عقب، \K، \b یا \B درگیر بوده باشد، ممکن است شامل کاراکترهایی قبل از شروع واقعی تطابق باشد).
اگر /g روی الگو وجود داشته باشد، جستجو برای تطابقهای بیشتر در انتهای طولانیترین تطابق از سر گرفته میشود. برای مثال:
re> /(tang|tangerine|tan)/g data> yellow tangerine and tangy sultana\D 0: tangerine 1: tang 2: tan 0: tang 1: tan 0: tan
از آنجا که تابع تطبیق از ضبط زیررشته پشتیبانی نمیکند، دنبالههای گریزی که مربوط به زیررشتههای ضبطشده هستند کاربردی ندارند.
شروع مجدد پس از تطابق جزئی (RESTARTING AFTER A PARTIAL MATCH)
هنگامی که تابع تطبیق جایگزین بازگشت PCRE_ERROR_PARTIAL را ارائه داده است، که نشان میدهد رشته هدف به طور جزئی با الگو تطبیق یافته است، میتوانید با استفاده از دنباله گریز \R تطابق را با دادههای هدف اضافی از سر بگیرید. برای مثال:
re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/ data> 23ja\P\D Partial match: 23ja data> n05\R\D 0: n05
برای اطلاعات بیشتر درباره تطابق جزئی، به مستندات pcrepartial مراجعه فرمایید.
فراخوانیها (CALLOUTS)
اگر الگو حاوی هرگونه درخواست فراخوانی باشد، تابع فراخوانی pcretest در طول تطبیق فراخوانی میشود. این با هر دو تابع تطبیق کار میکند. به طور پیشفرض، تابع فراخوانیشده شماره فراخوانی، موقعیتهای شروع و فعلی در متن در زمان فراخوانی، و آیتم بعدی الگو را که باید آزمایش شود نمایش میدهد. برای مثال:
--->pqrabcdef 0 ^ ^ \d
این خروجی نشان میدهد که فراخوانی شماره 0 برای تلاش تطبیقی رخ داده است که از چهارمین کاراکتر رشته هدف شروع شده، زمانی که نشانگر در هفتمین کاراکتر داده بود، و زمانی که آیتم بعدی الگو \d بود. اگر موقعیتهای شروع و فعلی یکسان باشند، تنها یک علامت هشتک (^) چاپ میشود.
فراخوانیهای شمارهگذاریشده به عنوان 255 به عنوان فراخوانیهای خودکار فرض میشوند که در نتیجه تغییردهنده الگوی /C درج شدهاند. در این حالت، به جای نمایش شماره فراخوانی، آفست در الگو با علامت مثبت قبل از آن نمایش داده میشود. برای مثال:
re> /\d?[A-E]\*/C data> E* --->E* +0 ^ \d? +3 ^ [A-E] +8 ^^ \* +10 ^ ^ 0: E*
اگر الگویی حاوی آیتمهای (*MARK) باشد، هر زمان که تغییری در جدیدترین علامت به تابع فراخوانی ارسال شود یک خط اضافی در خروجی نمایش داده میشود. برای مثال:
re> /a(*MARK:X)bc/C data> abc --->abc +0 ^ a +1 ^^ (*MARK:X) +10 ^^ b Latest Mark: X +11 ^ ^ c +12 ^ ^ 0: abc
علامت بین تطبیق "a" و "b" تغییر میکند، اما برای بقیه تطابق یکسان باقی میماند، بنابراین خروجی دیگری نمایش داده نمیشود. اگر در نتیجه پسگرد، علامت به حالت تنظیمنشده بازگردد، متن "<unset>" در خروجی چاپ میشود.
تابع فراخوانی در pcretest به طور پیشفرض صفر برمیگرداند (تطبیق را ادامه بده)، اما شما میتوانید از یک آیتم \C در یک خط داده (همانطور که در بالا شرح داده شد) برای تغییر این مورد و سایر پارامترهای فراخوانی استفاده کنید.
درج فراخوانیها میتواند هنگام استفاده از pcretest برای بررسی عبارات باقاعده پیچیده مفید باشد. برای اطلاعات بیشتر درباره فراخوانیها، به مستندات pcrecallout مراجعه فرمایید.
کاراکترهای غیرقابل چاپ (NON-PRINTING CHARACTERS)
هنگامی که pcretest متنی را در نسخه کامپایلشده یک الگو چاپ میکند، بایتهایی غیر از 32-126 همیشه به عنوان کاراکترهای غیرقابل چاپ در نظر گرفته میشوند و بنابراین به عنوان دنبالههای گریز در مبنای شانزده نمایش داده میشوند.
هنگامی که pcretest متنی را چاپ میکند که بخشی تطبیقیافته از یک رشته هدف است، به همان روش عمل میکند، مگر اینکه محلیسازی متفاوتی برای الگو تنظیم شده باشد (با استفاده از تغییردهنده /L). در این حالت، از تابع isprint() برای تشخیص کاراکترهای چاپی و غیرقابل چاپ استفاده میشود.
ذخیره و بارگذاری مجدد الگوهای کامپایلشده (SAVING AND RELOADING COMPILED PATTERNS)
امکانات شرح داده شده در این بخش زمانی که از رابط POSIX برای PCRE استفاده میشود، یعنی هنگامی که تغییردهنده الگوی /P مشخص شده باشد، در دسترس نیستند.
هنگامی که رابط POSIX در حال استفاده نیست، میتوانید با قرار دادن > و یک نام فایل پس از تغییردهندهها، باعث شوید pcretest یک الگوی کامپایلشده را در یک فایل بنویسد. برای مثال:
/pattern/im >/some/file
برای بحث و گفتگو درباره ذخیره و استفاده مجدد از الگوهای کامپایلشده، به مستندات pcreprecompile مراجعه نمایید. توجه داشته باشید که اگر الگو با موفقیت با بهینهسازی JIT مطالعه شده باشد، دادههای JIT قابل ذخیره نیستند.
دادههایی که نوشته میشوند باینری (دودویی) هستند. هشت بایت اول طول دادههای الگوی کامپایلشده و به دنبال آن طول دادههای مطالعه اختیاری است، که هر یک به صورت چهار بایت با ترتیب big-endian (بایتی با بیشترین ارزش در ابتدا) نوشته میشوند. اگر داده مطالعهای وجود نداشته باشد (یا الگو مطالعه نشده باشد یا مطالعه دادهای بازنگردانده باشد)، طول دوم صفر است. به دنبال طولها، یک کپی دقیق از الگوی کامپایلشده میآید. اگر دادههای مطالعه اضافی وجود داشته باشد، این دادهها (به استثنای هرگونه داده JIT) بلافاصله پس از الگوی کامپایلشده قرار میگیرند. پس از نوشتن فایل، pcretest انتظار دارد یک الگوی جدید را بخواند.
یک الگوی ذخیرهشده را میتوان با تعیین < و یک نام فایل به جای یک الگو، مجدداً در pcretest بارگذاری کرد. نباید هیچ فاصلهای بین < و نام فایل وجود داشته باشد، و نام فایل نباید شامل کاراکتر < باشد، زیرا در غیر این صورت pcretest خط را به عنوان الگویی که با کاراکترهای < احاطه شده است تفسیر میکند. برای مثال:
re> </some/file Compiled pattern loaded from /some/file No study data
اگر الگو قبلاً با بهینهسازی JIT مطالعه شده باشد، اطلاعات JIT نمیتواند ذخیره و بازیابی شود، و بنابراین از دست میرود. هنگامی که الگو بارگذاری شد، pcretest طبق روال معمول به خواندن خطوط داده ادامه میدهد.
شما میتوانید فایلی را که توسط pcretest نوشته شده است در میزبانی متفاوت کپی کرده و در آنجا مجدداً بارگذاری کنید، حتی اگر میزبان جدید ترتیب بایتی (endianness) متضادی با میزبانی که الگو روی آن کامپایل شده است داشته باشد. برای مثال، میتوانید روی یک ماشین i86 کامپایل کرده و روی یک ماشین SPARC اجرا کنید. هنگامی که یک الگو در میزبانی با ترتیب بایتی متفاوت مجدداً بارگذاری میشود، پیام تأیید به این صورت تغییر میکند:
Compiled pattern (byte-inverted) loaded from /some/file
مجموعه آزمون حاوی برخی از الگوهای از پیش کامپایلشده ذخیرهشده با ترتیب بایتی متفاوت است. این موارد با استفاده از "<!" به جای فقط "<" مجدداً بارگذاری میشوند. این کار متن "(byte-inverted)" را متوقف میکند تا خروجی در تمام میزبانها یکسان باشد. همچنین این کار خروجی اشکالزدایی را پس از بارگذاری مجدد الگو اجباری میکند.
نام فایلها برای ذخیره و بارگذاری مجدد میتوانند مطلق یا نسبی باشند، اما توجه داشته باشید که امکان پوسته برای بسط نام فایلی که با تیلدا (~) شروع میشود در دسترس نیست.
قابلیت ذخیره و بارگذاری مجدد فایلها در pcretest برای آزمون و آزمایش در نظر گرفته شده است. این برای استفاده در محیط عملیاتی در نظر گرفته نشده است زیرا فقط یک الگوی واحد را میتوان در یک فایل نوشت. علاوه بر این، هیچ امکانی برای ارائه جداول کاراکتری سفارشی برای استفاده با یک الگوی مجدداً بارگذاریشده وجود ندارد. اگر الگوی اصلی با جداول سفارشی کامپایل شده باشد، تلاش برای تطبیق یک رشته هدف با استفاده از الگوی مجدداً بارگذاریشده احتمالاً باعث از کار افتادن (crash) pcretest خواهد شد. در نهایت، اگر تلاش کنید فایلی را بارگذاری کنید که در فرمت صحیح نیست، نتیجه تعریفنشده خواهد بود.
همچنین ببینید (SEE ALSO)
pcre(3), pcre16(3), pcre32(3), pcreapi(3), pcrecallout(3), pcrejit, pcrematching(3), pcrepartial(d), pcrepattern(3), pcreprecompile(3).
نویسندگان (AUTHORS)
Philip Hazel University Computing Service Cambridge CB2 3QH, England.
بازبینی (REVISION)
Last updated: 10 February 2020 Copyright (c) 1997-2020 University of Cambridge.
| 10 February 2020 | PCRE 8.44 |