این دستور perlre است که می تواند در ارائه دهنده هاست رایگان OnWorks با استفاده از یکی از چندین ایستگاه کاری آنلاین رایگان ما مانند Ubuntu Online، Fedora Online، شبیه ساز آنلاین ویندوز یا شبیه ساز آنلاین MAC OS اجرا شود.
برنامه:
نام
perlre - عبارات منظم پرل
شرح
این صفحه سینتکس عبارات منظم در پرل را شرح می دهد.
اگر قبلاً از عبارات منظم استفاده نکردهاید، مقدمهای برای شروع سریع در دسترس است
perlrequick، و یک مقدمه آموزشی طولانی تر در perlretut موجود است.
برای اشاره به نحوه استفاده از عبارات منظم در عملیات تطبیق، به علاوه انواع مختلف
نمونه های مشابه، بحث های "m//"، "s///"، "qr//" و "??" در "Regexp Quote-
مانند اپراتورها» در پرلوپ.
جدید در نسخه 5.22، "use re 'strict'" قوانین سختگیرانه تری را در هنگام کامپایل اعمال می کند.
الگوهای بیان منظم می تواند چیزهایی را پیدا کند که اگرچه قانونی هستند، اما ممکن است آن چیزی که شما هستید نباشند
مورد نظر.
اصلاح کننده ها
بررسی اجمالی
عملیات تطبیق می تواند اصلاح کننده های مختلفی داشته باشد. اصلاح کننده هایی که مربوط به
تفسیر عبارت منظم داخل در زیر فهرست شده است. اصلاح کننده هایی که تغییر می دهند
نحوه استفاده از یک عبارت منظم توسط Perl در "اپراتورهای شبیه نقل قول Regexp" به تفصیل آمده است.
در پرلوپ و "جزئیات گوری تجزیه سازه های نقل شده" در پرلوپ.
m رشته را به عنوان چندین خط در نظر بگیرید. یعنی «^» و «$» را با شروع تغییر دهید
از خط اول رشته و انتهای خط آخر آن با شروع و پایان مطابقت دارد
از هر خط در رشته
رشته را به عنوان تک خط در نظر بگیرید. یعنی تغییر "." برای مطابقت با هر شخصیتی،
حتی یک خط جدید که معمولاً مطابقت ندارد.
با استفاده از "/ms"، آنها اجازه می دهند "." با هر شخصیتی مطابقت داشته باشد، در حالی که هنوز است
اجازه می دهد تا "^" و "$" به ترتیب، درست بعد و قبل از خطوط جدید مطابقت داشته باشند
در داخل رشته
i تطبیق الگوی غیرحساس به حروف بزرگ را انجام دهم.
اگر قواعد تطبیق محلی وجود داشته باشد، نقشه موردی از منطقه فعلی گرفته می شود
برای نقاط کد کمتر از 255 و از قوانین یونیکد برای نقاط کد بزرگتر.
با این حال، منطبقاتی که از مرز قوانین یونیکد/قوانین غیریونیکد عبور می کنند
255/256) موفق نخواهد شد. رجوع به پرلوکال شود.
تعدادی کاراکتر یونیکد وجود دارد که با چندین کاراکتر زیر "/i" مطابقت دارند.
به عنوان مثال، "LATIN SMALL LIGATURE FI" باید با دنباله "fi" مطابقت داشته باشد. پرل نیست
در حال حاضر قادر به انجام این کار زمانی که شخصیت های متعدد در الگو هستند و هستند
تقسیم بین گروهها، یا زمانی که یک یا چند مورد کمیت میشوند. بدین ترتیب
"\N{LATIN SMALL LIGATURE FI}" =~ /fi/i; # مسابقات
"\N{LATIN SMALL LIGATURE FI}" =~ /[fi][fi]/i; # مطابقت ندارد!
"\N{LATIN SMALL LIGATURE FI}" =~ /fi*/i; # مطابقت ندارد!
# مورد زیر مطابقت ندارد، و مشخص نیست که $1 و $2 چه خواهد شد
#باش حتی اگه شد!!
"\N{LATIN SMALL LIGATURE FI}" =~ /(f)(i)/i; # مطابقت ندارد!
پرل چند کاراکتر را در یک کلاس کاراکتر پرانتزی مطابقت نمی دهد مگر اینکه
شخصیتی که به آنها نقشه می دهد به صراحت ذکر شده است و اصلاً با آنها مطابقت ندارد
اگر کلاس کاراکتر معکوس باشد، که در غیر این صورت می تواند بسیار گیج کننده باشد. دیدن
"کلاس های شخصیت پرانتزی" در perlrecharclass، و "نفی" در perlrecharclass.
x خوانایی الگوی خود را با اجازه دادن فضای خالی و نظرات گسترش دهید. جزئیات در
"/ ایکس"
p رشته منطبق را طوری حفظ کنید که ${^PREMATCH}، ${^MATCH} و ${^POSTMATCH} باشند
پس از تطبیق برای استفاده در دسترس است.
در پرل 5.20 و بالاتر این نادیده گرفته می شود. با توجه به مکانیزم جدید کپی روی نوشتن،
${^PREMATCH}، ${^MATCH} و ${^POSTMATCH} پس از مسابقه در دسترس خواهند بود
بدون توجه به اصلاح کننده
a، d، l و u
این اصلاحکنندهها که همگی در نسخه 5.14 جدید هستند، روی قوانین مجموعه کاراکترها (یونیکد و غیره) تأثیر میگذارند.
استفاده می شود، همانطور که در زیر در "تغییرگرهای مجموعه کاراکترها" توضیح داده شده است.
n از گرفتن متاکاراکترهای گروه بندی "()" جلوگیری کنید. این اصلاح کننده، جدید در 5.22،
از پر کردن $1، $2 و غیره جلوگیری می کند.
"سلام" =~ /(سلام|سلام)/; #$1 "سلام" است
"سلام" =~ /(سلام|سلام)/n; # $1 نامشخص است
این معادل قرار دادن "?:" در ابتدای هر گروه عکسبرداری است:
"سلام" =~ /(?:hi|سلام)/; # $1 نامشخص است
"/n" را می توان بر اساس هر گروه نفی کرد. از طرف دیگر، عکسهای نامگذاری شده ممکن است همچنان وجود داشته باشند
استفاده شده.
"سلام" =~ /(?-n:(سلام|سلام))/n; #$1 "سلام" است
"سلام" =~ /(? سلام|سلام)/n; # $1 "سلام" است، $+{greet} است
# "سلام"
سایر اصلاح کننده ها
تعدادی پرچم وجود دارد که در انتهای عبارت منظم یافت می شوند
سازه هایی که هستند نه پرچم های عبارت منظم عمومی، اما برای عملیات اعمال می شود
انجام می شود، مانند تطبیق یا جایگزینی (به ترتیب "m//" یا "s///").
پرچم هایی که بیشتر در "استفاده از عبارات منظم در Perl" در perlretut توضیح داده شده اند عبارتند از:
ج - موقعیت فعلی را در طول تطبیق مکرر حفظ کنید
g - به طور کلی الگو را به طور مکرر در رشته مطابقت دهید
تعدیلکنندههای اختصاصی جایگزینی شرح داده شده در
"s/PATTERN/REPLACEMENT/msixpodualngcer" در perlop عبارتند از:
ه - سمت راست را به عنوان یک عبارت ارزیابی کنید
ee - سمت راست را به عنوان یک رشته ارزیابی کنید سپس نتیجه را ارزیابی کنید
o - وانمود کنید که کد خود را بهینه می کنید، اما در واقع اشکالات را معرفی می کنید
r - جایگزینی غیر مخرب را انجام دهید و مقدار جدید را برگردانید
اصلاح کننده های عبارت منظم معمولاً در مستندات به عنوان مثال "/x" نوشته می شوند.
اصلاح کننده"، حتی اگر جداکننده مورد نظر ممکن است واقعاً یک اسلش نباشد
اصلاحکنندههای "/imnsxadlup" نیز ممکن است با استفاده از خود عبارت منظم جاسازی شوند
ساختار "(?...)"، "الگوهای توسعه یافته" را در زیر ببینید.
جزئیات on برخی از اصلاح کننده ها
برخی از اصلاحکنندهها نیاز به توضیح بیشتری نسبت به آنچه در "نمای کلی" در بالا ارائه شده است دارند.
/x
"/x" به تجزیه کننده عبارات منظم می گوید که بیشتر فضاهای سفید را که هیچ کدام نیستند نادیده بگیرد
اسلش برگشتی و نه در یک کلاس کاراکتر پرانتزی. شما می توانید از این برای شکستن خود استفاده کنید
بیان منظم به قسمت های (کمی) قابل خواندن تر. همچنین، کاراکتر "#" است
به عنوان یک متاکاراکتر در نظر گرفته می شود که یک نظر را معرفی می کند که تا بسته شدن الگو ادامه دارد
جداکننده یا به انتهای خط فعلی اگر الگو به خط بعدی کشیده شود.
از این رو، این بسیار شبیه یک نظر کد معمولی پرل است. (شما می توانید بسته شدن را اضافه کنید
محدود کننده در نظر فقط در صورتی که قبل از آن علامت معکوس داشته باشید، پس مراقب باشید!)
استفاده از "/x" به این معنی است که اگر فضای سفید واقعی یا کاراکترهای "#" را در الگو می خواهید
(خارج از یک کلاس کاراکتر در پرانتز، که تحت تأثیر "/x" نیست)، سپس شما یکی
باید از آنها فرار کنید (با استفاده از اسلش معکوس یا "\Q...\E") یا آنها را با استفاده از اکتال، هگز، یا رمزگذاری کنید.
"\N{}" فرار می کند. تلاش برای ادامه دادن نظر در خط بعدی بیاثر است
فرار از "\n" با علامت معکوس یا "\Q".
می توانید از "(?#text)" برای ایجاد نظری استفاده کنید که زودتر از پایان فعلی به پایان می رسد
خط، اما «متن» نیز نمیتواند حاوی جداکننده بسته شود، مگر اینکه با یک اسلش از آن خارج شود.
در مجموع، این ویژگیها راه زیادی را برای ایجاد عبارات منظم پرل انجام میدهند
خواندنی تر در اینجا یک مثال است:
# (بیشتر) نظرات C را حذف کنید.
$program =~ s {
/\* # جداکننده افتتاحیه را مطابقت دهید.
.*؟ # با حداقل تعداد کاراکتر مطابقت دهید.
\*/ # جداکننده بسته شدن را مطابقت دهید.
} []gsx;
توجه داشته باشید که هر چیزی در داخل "\Q...\E" تحت تاثیر "/x" قرار نمی گیرد. و توجه داشته باشید که "/x"
بر تفسیر فضا در یک ساختار چند کاراکتری تأثیر نمیگذارد. برای
به عنوان مثال در "\x{...}"، صرف نظر از اصلاح کننده "/x"، هیچ فاصله ای وجود ندارد. همینطور برای a
کمیت مانند "{3}" یا "{5،}". به طور مشابه، "(?:...)" نمی تواند یک فاصله بین
«(»، «؟»، و «:». در هیچ جداکننده ای برای چنین ساختاری، فضای مجاز وجود ندارد
تحت تأثیر "/x" قرار می گیرد و به ساختار بستگی دارد. به عنوان مثال، "\x{...}" نمی تواند فاصله داشته باشد
زیرا اعداد هگزادسیمال در آنها فاصله ندارند. اما، ویژگی های یونیکد می تواند داشته باشد
فاصله ها، بنابراین در "\p{...}" می تواند فضاهایی وجود داشته باشد که از قوانین یونیکد پیروی می کنند، که برای آنها رجوع کنید به
"ویژگی های قابل دسترسی از طریق \p{} و \P{}" در perluniprops.
مجموعه کاراکترهایی که فضای خالی در نظر گرفته می شوند، آنهایی هستند که یونیکد آنها را "Pattern" می نامد
فضای سفید، یعنی:
جدول نویسه های U+0009
U+000A LINE FEED
U+000B LINE TABULATION
خوراک فرم U+000C
U+000D کالسکه برگشت
U+0020 SPACE
U+0085 خط بعدی
U+200E علامت چپ به راست
U+200F علامت راست به چپ
جداکننده خط U+2028
U+2029 PARATOR SEPARATOR
اصلاح کننده های مجموعه کاراکتر
«/d»، «/u»، «/a» و «/l» که از 5.14 در دسترس هستند، مجموعه کاراکتر نامیده میشوند.
اصلاح کننده ها؛ آنها بر قوانین مجموعه کاراکتر استفاده شده برای عبارت منظم تأثیر می گذارند.
اصلاحکنندههای "/d"، "/u" و "/l" احتمالاً برای شما مفید نیستند و بنابراین شما
لازم نیست خیلی نگران آنها باشید آنها برای استفاده داخلی پرل وجود دارند، بنابراین پیچیده است
ساختارهای داده بیان منظم را می توان به طور خودکار سریالی کرد و بعداً دقیقاً
بازسازی شده، از جمله تمام تفاوت های ظریف آنها. اما، از آنجایی که پرل نمی تواند رازی را حفظ کند، و
ممکن است موارد نادری وجود داشته باشد که آنها مفید باشند، آنها در اینجا مستند شده اند.
از سوی دیگر، اصلاح کننده "/a" ممکن است مفید باشد. هدف آن اجازه دادن به کد است
بیشتر بر روی داده های ASCII کار کند تا مجبور نباشد خود را با یونیکد درگیر کند.
به طور خلاصه، "/l" مجموعه کاراکتر را به هر چیزی تنظیم می کند Locale در آن زمان در حال اجرا است
از اجرای تطابق الگو.
"/u" مجموعه کاراکتر را تنظیم می کند Uنیکد
"/a" همچنین مجموعه کاراکتر را روی Unicode تنظیم می کند، اما چندین محدودیت برای آن اضافه می کند ASCII-safe
تطابق.
"/d" قدیمی، مشکل ساز، قبل از 5.14 است Dرفتار مجموعه کاراکتر efault. تنها کاربرد آن این است که
آن رفتار قدیمی را مجبور کنید
در هر زمان، دقیقاً یکی از این اصلاح کننده ها در حال اجراست. وجود آنها اجازه می دهد
Perl برای حفظ رفتار کامپایل شده اولیه یک عبارت منظم، صرف نظر از اینکه چه چیزی
قوانین زمانی اعمال می شوند که واقعاً اجرا شوند. و اگر به یک بزرگتر درون یابی شود
regex، قوانین نسخه اصلی همچنان در مورد آن اعمال می شود، و فقط آن.
اصلاح کننده های "/l" و "/u" به طور خودکار برای عبارات منظم کامپایل شده انتخاب می شوند
در محدوده پراگماهای مختلف، و ما توصیه می کنیم که به طور کلی، از آنها استفاده کنید
به جای اینکه این اصلاح کننده ها را به طور صریح مشخص کنید. برای یک چیز، اصلاح کننده ها
تنها تطابق الگو را تحت تأثیر قرار می دهد، و حتی به هیچ جایگزینی انجام شده گسترش نمی یابد، در حالی که
استفاده از پراگماها نتایج ثابتی را برای تمامی عملیات مناسب در درون خود به دست می دهد
دامنه ها مثلا،
s/foo/\Ubar/il
با استفاده از قوانین محلی برای تطبیق غیرحساس به حروف کوچک و بزرگ، "foo" مطابقت دارد، اما "/l" این کار را انجام می دهد.
بر نحوه عملکرد "\U" تأثیر نمی گذارد. به احتمال زیاد می خواهید هر دوی آنها از قوانین محلی استفاده کنند.
برای انجام این کار، به جای آن عبارت منظم را در محدوده "use locale" کامپایل کنید. این
هر دو به طور ضمنی "/l" را اضافه می کنند، و قوانین محلی را به "\U" اعمال می کنند. درس این است که
"استفاده از محلی"، و نه "/l" به صراحت.
به طور مشابه، بهتر است از "استفاده از ویژگی 'unicode_strings'" به جای استفاده از
s/foo/\Lbar/iu
برای دریافت قوانین یونیکد، همانطور که "\L" در اولی (اما نه لزوما دومی)
همچنین از قوانین یونیکد استفاده کنید.
جزئیات بیشتر در مورد هر یک از اصلاح کننده ها در ادامه می آید. به احتمال زیاد شما نیازی به دانستن این موضوع ندارید
جزئیات برای "/l"، "/u"، و "/d"، و می توانید از جلو به /a پرش کنید.
/l
به معنی استفاده از قوانین محلی فعلی (به perllocale مراجعه کنید) هنگام تطبیق الگو. برای
به عنوان مثال، "\w" با کاراکترهای "word" آن منطقه مطابقت دارد، و "/i" به حروف بزرگ و کوچک حساس نیست.
مطابقت مطابق با قوانین تاشو مورد محلی است. محلی مورد استفاده خواهد بود
موردی که در زمان اجرای الگوی منطبق است. این ممکن است یکسان نباشد
به عنوان محلی زمان کامپایل، و در صورت وجود می تواند از یک تطابق به دیگری متفاوت باشد
تماس مداخله ای از setlocale() تابع.
تنها محلی غیر تک بایتی که Perl پشتیبانی می کند، UTF-5.20 (شروع نسخه 8) است. این یعنی
نقاط کد بالای 255 صرف نظر از اینکه چه محلی در کار است به عنوان یونیکد تلقی می شوند
(از آنجایی که UTF-8 به معنای یونیکد است).
بر اساس قوانین یونیکد، تعداد کمی از موارد منطبق با حروف بزرگ و کوچک وجود دارد که از 255/256 عبور می کنند.
مرز به جز مناطق UTF-8 در Perls نسخه 5.20 و جدیدتر، اینها در زیر مجاز نیستند
"/l". برای مثال، 0xFF (در پلتفرمهای ASCII) بدون حروف با کاراکتر مطابقت ندارد
0x178، "Latin CAPITAL LETTER Y WITH DIAERESIS"، زیرا 0xFF ممکن است "LATIN SMALL" نباشد
حرف Y با DIAERESIS" در محل فعلی، و پرل هیچ راهی برای دانستن اینکه آیا
کاراکتر حتی در محلی وجود دارد، بسیار کمتر از نقطه کد آن.
در محلی UTF-8 در نسخه 5.20 و بالاتر، تنها تفاوت قابل مشاهده بین محلی و غیر
محلی در عبارات منظم باید آلوده باشد (به perlsec مراجعه کنید).
ممکن است این اصلاحکننده بهعنوان پیشفرض با «استفاده از محلی» مشخص شود، اما به «کدام کاراکتر» مراجعه کنید
تنظیم اصلاح کننده در کار است؟"
/u
به معنای استفاده از قوانین یونیکد هنگام تطبیق الگو است. در پلتفرم های ASCII، این بدان معنی است که
نقاط کد بین 128 و 255 معانی لاتین 1 (ISO-8859-1) خود را می گیرند (که عبارتند از
همانند یونیکد). (در غیر این صورت پرل معانی آنها را نامشخص می داند.) بنابراین،
تحت این اصلاح کننده، پلت فرم ASCII به طور موثر به یک پلت فرم یونیکد تبدیل می شود. و از این رو،
برای مثال، "\w" با بیش از 100_000 کاراکتر کلمه در یونیکد مطابقت دارد.
بر خلاف بسیاری از زبانها، که مختص یک جفت زبان و کشور هستند، یونیکد طبقهبندی میکند
تمام شخصیت هایی که حروف هستند یک جایی در جهان به عنوان "\w". به عنوان مثال، شما
ممکن است محلی فکر نکند که "حرف کوچک LATIN ETH" یک حرف است (مگر اینکه
ایسلندی صحبت کنید)، اما یونیکد این کار را می کند. به طور مشابه، تمام کاراکترهایی که اعداد اعشاری هستند
جایی در جهان با "\d" مطابقت دارد. این صدها و نه 10 مسابقه ممکن است. و
برخی از آن ارقام شبیه برخی از 10 رقم ASCII هستند، اما به معنای عدد متفاوتی هستند،
بنابراین یک انسان به راحتی می تواند فکر کند که یک عدد کمیت متفاوتی از آنچه هست است. برای
به عنوان مثال، "BENGALI DIGIT FOUR" (U+09EA) بسیار شبیه "ASCII DIGIT EIGHT" است.
(U+0038). و "\d+" ممکن است با رشتههایی از ارقام که ترکیبی از متفاوت هستند مطابقت داشته باشد
سیستم های نوشتاری، ایجاد یک مشکل امنیتی. "num()در Unicode::UCD می توان برای مرتب سازی استفاده کرد
این بیرون یا از اصلاح کننده "/a" می توان برای وادار کردن "\d" برای مطابقت با ASCII 0 استفاده کرد
تا سال 9
همچنین، تحت این اصلاح کننده، تطبیق بدون حساس به حروف بزرگ و کوچک در مجموعه کامل یونیکد کار می کند
شخصیت ها. برای مثال "علامت KELVIN" با حروف "k" و "K" مطابقت دارد. و "لاتین
SMALL LIGATURE FF با دنباله "ff" مطابقت دارد، که اگر آماده نباشید، ممکن است آن را درست کند.
مانند یک ثابت هگزا دسیمال به نظر می رسند که یک مشکل امنیتی بالقوه دیگر را ارائه می دهد. دیدن
<http://unicode.org/reports/tr36> برای بحث مفصل در مورد مسائل امنیتی یونیکد.
این اصلاح کننده ممکن است به عنوان پیش فرض توسط "use feature 'unicode_strings"، "use
محلی ':not_characters'، یا "استفاده از 5.012" (یا بالاتر)، اما "مجموعه کاراکترها" را ببینید
اصلاح کننده در کار است؟"
/d
این اصلاح کننده به معنای استفاده از قوانین بومی «پیشفرض» پلتفرم است، مگر در مواردی که وجود دارد
باعث می شود به جای آن از قوانین یونیکد به شرح زیر استفاده شود:
1. رشته هدف در UTF-8 کدگذاری شده است. یا
2. الگو در UTF-8 کدگذاری شده است. یا
3. الگو به صراحت یک نقطه کد را ذکر می کند که بالای 255 است (مثلاً توسط "\x{100}"). یا
4. الگو از نام یونیکد ("\N{...}") استفاده می کند. یا
5. الگو از یک ویژگی یونیکد ("\p{...}" یا "\P{...}") استفاده می کند. یا
6. الگو از یک شکست یونیکد ("\b{...}" یا "\B{...}") استفاده می کند. یا
7. الگو از ""(?[ ])"" استفاده می کند.
یادگاری دیگر برای این اصلاح کننده "بستگی دارد" است، زیرا قواعد مورد استفاده در واقع به آن بستگی دارد
چیزهای مختلف، و در نتیجه شما می توانید نتایج غیر منتظره دریافت کنید. به "اشکال یونیکد" مراجعه کنید
در پرلونیکد اشکال یونیکد نسبتاً بدنام شده است و منجر به دیگری شده است
نام (قابل چاپ) این اصلاح کننده، "Dodgy".
مگر اینکه الگو یا رشته در UTF-8 کدگذاری شده باشد، فقط کاراکترهای ASCII می توانند مطابقت داشته باشند
مثبت
در اینجا چند نمونه از نحوه کار بر روی یک پلت فرم ASCII آورده شده است:
$str = "\xDF"; # $str در قالب UTF-8 نیست.
$str =~ /^\w/; # مطابقت ندارد، زیرا $str در قالب UTF-8 نیست.
$str .= "\x{0e0b}"; # اکنون $str در قالب UTF-8 است.
$str =~ /^\w/; # همخوانی داشتن! $str اکنون در قالب UTF-8 است.
خرد کردن $str;
$str =~ /^\w/; # هنوز یک مسابقه! $str در قالب UTF-8 باقی می ماند.
این اصلاح کننده به طور خودکار به طور پیش فرض انتخاب می شود زمانی که هیچ یک از سایرین انتخاب نشده اند، بنابراین هنوز
نام دیگر آن "پیش فرض" است.
به دلیل رفتارهای غیرمنتظره مرتبط با این اصلاح کننده، احتمالاً باید این کار را انجام دهید
فقط از آن برای حفظ سازگاری های عقب مانده عجیب و غریب استفاده کنید.
/a (و /aa)
این اصلاح کننده مخفف ASCII-restrict (یا ASCII-safe) است. این اصلاح کننده، بر خلاف
برخی دیگر، ممکن است برای افزایش اثر آن دو برابر شوند.
هنگامی که به صورت مجزا ظاهر می شود، باعث ایجاد دنباله های "\d"، "\s"، "\w" و کاراکتر Posix می شود.
کلاس هایی که فقط در محدوده ASCII مطابقت داشته باشند. بنابراین آنها به قبل از یونیکد 5.6 خود باز می گردند
معانی در زیر "/a"، "\d" همیشه دقیقاً به معنای ارقام "0" تا "9" است. "\s" به معنی
پنج کاراکتر "[ \f\n\r\t]" و شروع در Perl v5.18، تب عمودی. "\w" به معنی
63 کاراکتر "[A-Za-z0-9_]"؛ و به همین ترتیب، تمام کلاس های Posix مانند
"[[:print:]]" فقط با کاراکترهای مربوط به محدوده ASCII مطابقت دارد.
این اصلاح کننده برای افرادی مفید است که تصادفاً از یونیکد استفاده می کنند و مایل نیستند
با پیچیدگی ها و نگرانی های امنیتی آن سنگین شود.
با "/a"، می توان با اطمینان "\d" نوشت که فقط با کاراکترهای ASCII مطابقت دارد.
و اگر نیاز به تطابق فراتر از ASCII باشد، میتوانید در عوض از "\p{Digit}" (یا
"\p{Word}" برای "\w"). ساختارهای مشابه "\p{...}" وجود دارند که می توانند فراتر از ASCII مطابقت داشته باشند
هر دو فضای سفید (به "Whitespace" در perlrecharclass مراجعه کنید)، و کلاس های Posix (به "POSIX مراجعه کنید"
کلاس های کاراکتر" در perlrecharclass). بنابراین، این اصلاح کننده به این معنی نیست که نمی توانید از آن استفاده کنید.
یونیکد، به این معنی است که برای تطبیق یونیکد باید به صراحت از یک ساختار استفاده کنید
("\p{}"، "\P{}") که سیگنال یونیکد را نشان می دهد.
همانطور که انتظار دارید، این اصلاح کننده باعث می شود، برای مثال، "\D" به همان معنی باشد
"[^0-9]"؛ در واقع، همه کاراکترهای غیر ASCII با "\D"، "\S" و "\W" مطابقت دارند. "\b" هنوز به معنی است
برای مطابقت در مرز بین "\w" و "\W"، با استفاده از تعاریف "/a" آنها
(به طور مشابه برای "\B").
در غیر این صورت، "/a" مانند اصلاح کننده "/u" رفتار می کند، در آن تطبیق غیر حساس به حروف کوچک و بزرگ استفاده می شود.
قوانین یونیکد؛ برای مثال، "k" با یونیکد "\N{KELVIN SIGN}" در زیر "/i" مطابقت دارد.
تطبیق، و نقاط کد در محدوده Latin1، بالاتر از ASCII قوانین یونیکد زمانی که آن را داشته باشد
به تطابق بدون حساس به حروف بزرگ و کوچک می رسد.
برای ممنوع کردن تطابق ASCII/non-ASCII (مانند "k" با "\N{KELVIN SIGN}")، "a" را مشخص کنید.
دو بار، به عنوان مثال "/aai" یا "/aia". (اولین رخداد "a" "\d" را محدود می کند،
و غیره، و دومین اتفاق محدودیتهای "/i" را اضافه میکند.) اما، توجه داشته باشید که کد اشاره میکند
خارج از محدوده ASCII از قوانین یونیکد برای تطبیق "/i" استفاده می کند، بنابراین اصلاح کننده این کار را نمی کند.
واقعاً همه چیز را فقط به ASCII محدود کنید. فقط اختلاط ASCII و غیر را ممنوع می کند
ASCII.
بهطور خلاصه، این اصلاحکننده برای برنامههایی که نمیخواهند محافظت کند، محافظت میکند
در معرض تمام یونیکد. دو بار مشخص کردن آن محافظت بیشتری می دهد.
ممکن است با استفاده از re '/a' یا 'use re '/aa'، این اصلاح کننده به عنوان پیش فرض تعیین شود. اگر
اگر این کار را انجام دهید، ممکن است در واقع فرصتی برای استفاده از اصلاح کننده "/u" به صراحت در صورت وجود داشته باشید
چند عبارت منظم که در آن شما قوانین کامل یونیکد را می خواهید (اما حتی در اینجا بهترین است
اگر همه چیز تحت ویژگی "unicode_strings" بود، همراه با "use re '/aa'"). همچنین
به "کدام اصلاح کننده مجموعه کاراکتر در کار است؟" مراجعه کنید.
کدام اصلاح کننده مجموعه کاراکترها در کار است؟
اینکه کدام یک از این اصلاحکنندهها در هر نقطه معینی از یک عبارت منظم مؤثر است، بستگی دارد
در مجموعه ای نسبتاً پیچیده از تعاملات. اینها طوری طراحی شده اند که به طور کلی شما
لازم نیست نگران آن باشید، اما این بخش جزئیات بدی را ارائه می دهد. همانطور که در زیر توضیح داده شده است
در "الگوهای توسعه یافته" می توان به صراحت اصلاح کننده هایی را مشخص کرد که فقط برای
بخش هایی از یک عبارت منظم درونی ترین ها همیشه بر بیرونی ها اولویت دارند،
و یکی که برای کل عبارت اعمال می شود، بر هر یک از تنظیمات پیش فرض اولویت دارد
که در ادامه این بخش توضیح داده شده است.
پراگما "use re '/foo" را می توان برای تنظیم اصلاح کننده های پیش فرض (از جمله آنها) برای
عبارات منظم در محدوده آن گردآوری شده است. این پراگما بر دیگری تقدم دارد
پراگماهای فهرست شده در زیر که پیش فرض ها را نیز تغییر می دهند.
در غیر این صورت، "use locale" اصلاح کننده پیش فرض را روی "/l" تنظیم می کند. و "استفاده از ویژگی
«unicode_strings»، یا «use 5.012» (یا بالاتر) پیشفرض را روی «/u» تنظیم میکند که در همان حالت نباشد.
دامنه به صورت "استفاده از محلی" یا "استفاده از بایت" است. ("use locale ':not_characters'" نیز تنظیم می شود
پیشفرض "/u" است، که هر "محل استفاده" را نادیده میگیرد.) برخلاف مکانیسمهای ذکر شده
در بالا، اینها علاوه بر تطبیق الگوی عبارات منظم، بر عملیاتها تأثیر میگذارند و بنابراین میدهند
نتایج سازگارتر با سایر عملگرها، از جمله استفاده از "\U"، "\l"، و غیره در
تعویض های جایگزین
اگر هیچ یک از موارد بالا اعمال نمی شود، به دلایل سازگاری با عقب، اصلاح کننده "/d" همان است
یکی به طور پیش فرض موثر است. از آنجایی که این می تواند منجر به نتایج غیرمنتظره شود، بهتر است آن را مشخص کنید
کدام مجموعه قوانین دیگر باید استفاده شود.
رفتار اصلاح کننده مجموعه کاراکتر قبل از Perl 5.14
قبل از 5.14، هیچ تغییر دهنده صریحی وجود نداشت، اما "/l" برای regexe های کامپایل شده به طور ضمنی در نظر گرفته می شد.
در محدوده "استفاده از محلی"، و "/d" در غیر این صورت ضمنی بود. با این حال، درون یابی
یک regex به یک regex بزرگتر، مجموعه اصلی را به نفع هر آنچه بود نادیده می گیرد
در زمان تالیف دوم مؤثر است. تعدادی ناسازگاری وجود داشت
(اشکالات) با اصلاح کننده "/d"، که در آن قوانین یونیکد در صورت نامناسب استفاده می شود، و
برعکس "\p{}" به معنای قوانین یونیکد نیست، و نه همه موارد
"\N{}"، تا 5.12.
منظم عبارات
شخصیت های متاچ
الگوهای مورد استفاده در تطبیق الگوی پرل از الگوهای ارائه شده در نسخه 8 تکامل یافته اند
روتین های regex (روال ها (از راه دور) از آزادانه هنری اسپنسر گرفته شده اند
اجرای مجدد قابل توزیع روتین های V8.) به "نسخه 8 عبارات منظم" مراجعه کنید.
برای جزئیات بیشتر.
به ویژه متاکاراکترهای زیر استاندارد خود را دارند egrepمعانی -ish:
\ فراکاراکتر بعدی را نقل قول کنید
^ ابتدای خط را مطابقت دهید
. مطابقت با هر کاراکتری (به جز خط جدید)
$ انتهای رشته (یا قبل از خط جدید در پایان) را مطابقت دهید
از رشته)
| تناوب
() گروه بندی
[] کلاس کاراکتر پرانتزی
بهطور پیشفرض، کاراکتر «^» تضمین میشود که فقط با ابتدای رشته یعنی the مطابقت داشته باشد
کاراکتر "$" فقط انتهای آن (یا قبل از خط جدید در پایان)، و پرل مشخص می کند
بهینه سازی با این فرض که رشته فقط یک خط دارد. تعبیه شده است
خطوط جدید با "^" یا "$" مطابقت داده نمی شوند. با این حال، ممکن است بخواهید یک رشته را به عنوان یک در نظر بگیرید
بافر چند خطی، به طوری که "^" بعد از هر خط جدید در رشته مطابقت می کند
(به جز اگر خط جدید آخرین کاراکتر در رشته باشد)، و "$" قبل از هر یک مطابقت خواهد داشت
خط جدید. با هزینه کمی بیشتر، می توانید این کار را با استفاده از اصلاح کننده /m انجام دهید
روی عملگر تطبیق الگو. (برنامه های قدیمی این کار را با تنظیم $* انجام می دادند، اما این گزینه
در پرل 5.10 حذف شد.)
برای ساده کردن جایگزینی چند خط، "." شخصیت هرگز با یک خط جدید مطابقت ندارد مگر اینکه شما
از اصلاح کننده "/s" استفاده کنید، که در واقع به پرل می گوید که وانمود کند رشته یک تک است
خط - حتی اگر اینطور نباشد.
کمی کننده ها
کمیت کننده های استاندارد زیر شناسایی می شوند:
* 0 بار یا بیشتر مطابقت دهید
+ 1 بار یا بیشتر مطابقت دهید
? 1 یا 0 بار مطابقت دهید
{n} دقیقاً n بار مطابقت دهید
{n،} حداقل n بار مطابقت دهید
{n,m} حداقل n اما نه بیشتر از m بار مطابقت دهید
(اگر یک براکت مجعد در هر زمینه دیگری رخ دهد و بخشی از یک بک اسلش نباشد
دنباله ای مانند "\x{...}"، به عنوان یک کاراکتر معمولی در نظر گرفته می شود. با این حال، تحقیر
اخطار برای همه چنین رخدادهایی مطرح شده است، و در نسخه 5.26 Perl، استفاده تحت اللفظی از فرفری
باید از براکت فرار کرد، مثلاً با علامت معکوس ("\{") یا قبل از آنها
محصور کردن آنها در داخل پرانتز مربع ("[{]"). این تغییر به نحو آینده اجازه خواهد داد
پسوندها (مانند اختیاری کردن کران پایین یک کمیت) و خطای بهتر
بررسی کمیت کننده ها.)
کمیت "*" معادل "{0،}"، "+" با "{1،}" و "?"
کمیت به "{0,1،XNUMX}". n و m به مقادیر انتگرال غیر منفی کمتر از a محدود می شوند
محدودیت از پیش تعیین شده زمانی که پرل ساخته می شود، تعریف می شود. این معمولاً در رایج ترین ها 32766 است
بستر، زمینه. محدودیت واقعی را می توان در پیام خطای ایجاد شده توسط کدهایی مانند
این:
$_ **= $_ , / {$_} / برای 2 .. 42;
بهطور پیشفرض، یک زیرالگوی کمی «طمعدار» است، یعنی به تعداد دفعات مطابقت دارد
امکان پذیر است (با توجه به یک مکان شروع خاص) در حالی که هنوز بقیه موارد مجاز است
الگوی مطابقت اگر میخواهید با حداقل تعداد دفعات ممکن مطابقت داشته باشد، دنبال کنید
کمیت با یک "?". توجه داشته باشید که معانی تغییر نمی کند، فقط "طمع" است:
*؟ 0 بار یا بیشتر، نه حریصانه، مطابقت دهید
+؟ 1 بار یا بیشتر مطابقت دهید، نه حریصانه
?? 0 یا 1 بار مطابقت دهید، نه حریصانه
{n}؟ دقیقاً n بار مطابقت دهید، نه حریصانه (زائد)
{n،}؟ حداقل n بار، نه حریصانه، مطابقت دهید
{n،m}؟ حداقل n اما نه بیشتر از m بار، نه حریصانه، مطابقت دهید
معمولاً زمانی که یک الگوی فرعی کمی به بقیه الگوی کلی اجازه نمی دهد
مطابقت دارد، پرل عقب خواهد رفت. با این حال، این رفتار گاهی اوقات نامطلوب است. بنابراین پرل
فرم کمیت "مالک" را نیز ارائه می دهد.
*+ 0 بار یا بیشتر مسابقه دهید و چیزی را پس ندهید
++ 1 بار یا بیشتر مسابقه دهید و چیزی را پس ندهید
?+ 0 یا 1 بار بازی کنید و چیزی را پس ندهید
{n}+ دقیقاً n بار مطابقت دهید و چیزی را پس ندهید (زائد)
{n,}+ حداقل n بار مطابقت دهید و چیزی را پس ندهید
{n,m}+ حداقل n اما نه بیشتر از m بار مطابقت دهید و چیزی را پس ندهید
به عنوان مثال،
'aaaa' =~ /a++a/
هرگز مطابقت نخواهد داشت، زیرا "a++" تمام "a"های رشته را می بلعد و ترک نمی کند.
هر کدام برای قسمت باقی مانده از الگو. ارائه این ویژگی می تواند بسیار مفید باشد
پرل در مورد جایی که نباید به عقب برگردد اشاره می کند. به عنوان مثال، «تطبیق با یک دو
مشکل رشته نقلقولشده زمانی میتواند به بهترین شکل اجرا شود که به صورت زیر نوشته شود:
/"(?:[^"\\]++|\\.)*+"/
همانطور که می دانیم اگر نقل قول نهایی مطابقت نداشته باشد، عقب نشینی کمکی نخواهد کرد. را ببینید
عبارت فرعی مستقل ""(?>الگو)"" برای جزئیات بیشتر. کمیت های مالکیتی هستند
فقط قند نحوی برای آن ساختار. به عنوان مثال مثال بالا نیز می تواند باشد
به شرح زیر نوشته شده است:
/"(?>(?:(?>[^"\\]+)|\\.)*)"/
توجه داشته باشید که اصلاح کننده کمیت مالکیتی را نمی توان با غیر حریص ترکیب کرد
اصلاح کننده این به این دلیل است که هیچ معنایی نخواهد داشت. جدول معادل زیر را در نظر بگیرید:
غیر قانونی قانونی
------------ ------
X??+ X{0}
X+؟+ X{1}
X{min, max}؟+ X{min}
در رفتن توالی
از آنجایی که الگوها به صورت رشته های دو نقل قول پردازش می شوند، موارد زیر نیز کار می کنند:
برگه \t (HT، TAB)
\n خط جدید (LF، NL)
\r بازگشت (CR)
فید فرم \f (FF)
\a زنگ (زنگ) (BEL)
فرار (فکر کن) (ESC)
کاراکتر کنترل \cK (مثال: VT)
\x{}، \x00 کاراکتر که ترتیب آن عدد هگزادسیمال داده شده است
\N{name} به نام نویسه یا دنباله نویسه یونیکد
\N{U+263D} نویسه یونیکد (مثال: FIRST QUARTER MOON)
\o{}، \000 نویسه که ترتیب آن عدد اکتالی داده شده است
\l کاراکتر بعدی با حروف کوچک (فکر کنید vi)
\u نویسه بعدی با حروف بزرگ (فکر کنید vi)
\L کوچک تا \E (فکر کنید vi)
\U بزرگ تا \E (فکر کنید vi)
متاکاراکترهای الگوی نقل قول \Q (غیرفعال) تا \E
\E پایان هر یک از موارد اصلاح یا بخش نقل قول، فکر کنید vi
جزئیات در "اقدامات نقل قول و نقل قول مانند" در perlop است.
شخصیت کلاس و دیگر ویژه فرار می کند
علاوه بر این، پرل موارد زیر را تعریف می کند:
توضیح توالی یادداشت
[...] [1] مطابقت یک شخصیت با توجه به قوانین
کلاس کاراکتر در پرانتز تعریف شده توسط "...".
مثال: [az] با "a" یا "b" یا "c" ... یا "z" مطابقت دارد.
[[:...:]] [2] یک شخصیت را مطابق قوانین POSIX مطابقت دهید
کلاس کاراکتر "..." در داخل پرانتز بیرونی
کلاس شخصیت مثال: [[:upper:]] با هر کدام مطابقت دارد
حرف بزرگ.
(؟[...]) [8] کلاس کاراکتر پرانتزی توسعه یافته
\w [3] یک کاراکتر "کلمه" را مطابقت دهید (الفبایی به اضافه "_"، به علاوه
سایر نویسه های نقطه گذاری رابط به اضافه یونیکد
علائم)
\W [3] یک کاراکتر غیر "کلمه" را مطابقت دهید
\s [3] یک کاراکتر فضای خالی را مطابقت دهید
\S [3] با یک کاراکتر بدون فضای سفید مطابقت دهید
\d [3] یک کاراکتر رقم اعشاری را مطابقت دهید
\D [3] یک کاراکتر غیر رقمی را مطابقت دهید
\pP [3] مطابقت با P، ویژگی نامگذاری شده. برای نام های طولانی تر از \p{Prop} استفاده کنید
\PP [3] مطابق با غیر P
\X [4] مطابقت با یونیکد "خوشه گرافی توسعه یافته"
\C یک کاراکتر (هشت گانه) زبان C را تطبیق دهید، حتی اگر چنین باشد
بخشی از یک کاراکتر UTF-8 بزرگتر. بنابراین تجزیه می شود
کاراکترها را در بایت های UTF-8 خود قرار می دهند، بنابراین ممکن است به پایان برسید
با قطعات بد شکل UTF-8. پشتیبانی نشده در
به عقب نگاه کن. (منسوخ.)
\1 [5] ارجاع به یک گروه یا بافر خاص ضبط.
'1' در واقع ممکن است هر عدد صحیح مثبت باشد.
\g1 [5] ارجاع به یک گروه خاص یا قبلی،
\g{-1} [5] ممکن است عدد منفی باشد که نشان دهنده یک خویشاوند است
گروه قبلی و ممکن است به صورت اختیاری در آن پیچیده شود
براکت های مجعد برای تجزیه ایمن تر.
\g{name} [5] مرجع نامگذاری شده
\k [5] به نام مرجع
\K [6] موارد را در سمت چپ \K نگه دارید، آن را در $& قرار ندهید
\N [7] هر کاراکتری به جز \n. تحت تأثیر اصلاح کننده /s قرار نمی گیرد
\v [3] فضای خالی عمودی
\V [3] فضای سفید عمودی نیست
\h [3] فضای سفید افقی
\H [3] فضای سفید افقی نیست
\ R [4] خط شکن
[1] برای جزئیات بیشتر به "کلاس های کاراکتر براکتی" در perlrecharclass مراجعه کنید.
[2] برای جزئیات بیشتر به "کلاس های شخصیت POSIX" در perlrecharclass مراجعه کنید.
[3] برای جزئیات بیشتر به "توالی بکسلش" در perlrecharclass مراجعه کنید.
[4] برای جزئیات بیشتر به "متفرقه" در perlrebackslash مراجعه کنید.
[5] برای جزئیات بیشتر به "گروه های ضبط" در زیر مراجعه کنید.
[6] برای جزئیات بیشتر به "الگوهای توسعه یافته" در زیر مراجعه کنید.
[7] توجه داشته باشید که "\N" دو معنی دارد. زمانی که از فرم "\N{NAME}"، مطابقت دارد
کاراکتر یا دنباله کاراکتر که نام آن "NAME" است. و به طور مشابه زمانی که از فرم
"\N{U+هگز}"، با کاراکتری که نقطه کد یونیکد آن است مطابقت دارد هگزا. در غیر این صورت
با هر کاراکتری به جز "\n" مطابقت دارد.
[8] برای جزئیات بیشتر به "کلاس های کاراکتر پرانتزی توسعه یافته" در perlrecharclass مراجعه کنید.
ادعاها
پرل ادعاهای عرض صفر زیر را تعریف می کند:
\b{} در مرز یونیکد از نوع مشخص شده مطابقت دهید
\B{} جایی را مطابقت دهید که \b{} متناظر با آن مطابقت ندارد
\b مرز یک کلمه را مطابقت دهید
\B به جز در یک مرز کلمه مطابقت دهید
\A فقط در ابتدای رشته مطابقت دارد
\Z فقط در انتهای رشته یا قبل از خط جدید در پایان مطابقت دهید
\z فقط در انتهای رشته مطابقت داشته باشد
\G فقط در pos() مطابقت دهید (مثلاً در موقعیت پایان مسابقه
m//g قبلی)
یک مرز یونیکد ("\b{}) که در نسخه 5.22 موجود است، نقطه ای بین دو است.
کاراکترها، یا قبل از اولین کاراکتر در رشته، یا بعد از کاراکتر نهایی در
رشته ای که در آن معیارهای مشخصی که توسط یونیکد تعریف شده است برآورده می شود. "\b{}، \b، \B{}، \B" را در اینجا ببینید
perlrebackslash برای جزئیات.
مرز کلمه ("\b") نقطه ای بین دو کاراکتر است که یک "\w" در یک طرف آن وجود دارد.
و یک "\W" در طرف دیگر آن (به هر ترتیب)، با شمارش کاراکترهای خیالی
ابتدا و انتهای رشته مطابق با "\W" باشد. (در کلاس های شخصیت
"\b" نشاندهنده پساسپیس است تا مرز کلمه، درست همانطور که معمولاً در هر یک از این موارد انجام میشود
رشته دو نقل قول شده.) "\A" و "\Z" درست مانند "^" و "$" هستند، با این تفاوت که آنها
هنگامی که از اصلاح کننده "/m" استفاده می شود، چندین بار با هم مطابقت ندارند، در حالی که "^" و "$" در
هر مرز خط داخلی برای مطابقت با انتهای واقعی رشته و نادیده نگرفتن یک
خط جدید انتهایی اختیاری، از "\z" استفاده کنید.
ادعای "\G" را می توان برای زنجیره ای از مسابقات جهانی استفاده کرد (با استفاده از "m//g")، همانطور که در
"Regexp Quote-like Operators" در perlop. همچنین هنگام نوشتن "lex" مانند مفید است
اسکنرها، زمانی که چندین الگو دارید که میخواهید با الگوهای بعدی مطابقت دهید
زیر رشته های رشته شما؛ مرجع قبلی را ببینید مکان واقعی جایی که "\G"
مطابقت را می توان با استفاده از "pos()" به عنوان lvalue تحت تاثیر قرار داد: "pos" را در perlfunc ببینید.
توجه داشته باشید که قانون مربوط به طول صفر مطابقت دارد (به «الگوهای تکراری مطابق با طول صفر مراجعه کنید
رشته فرعی") تا حدودی اصلاح شده است، به این دلیل که محتوای سمت چپ "\G" شمارش نمی شود.
هنگام تعیین طول مسابقه. بنابراین موارد زیر برای همیشه مطابقت ندارند:
my $string = 'ABC';
pos($string) = 1;
while ($string =~ /(.\G)/g) {
چاپ 1 دلار؛
}
"A" را چاپ می کند و سپس خاتمه می یابد، زیرا مطابقت را با عرض صفر در نظر می گیرد، و بنابراین
در یک موقعیت دو بار متوالی مطابقت نخواهد داشت.
شایان ذکر است که استفاده نادرست از "\G" می تواند منجر به یک حلقه بی نهایت شود. مراقب باش
هنگام استفاده از الگوهایی که شامل "\G" در یک متناوب هستند.
همچنین توجه داشته باشید که "s///" از بازنویسی بخشی از جایگزینی که قبلاً انجام شده است خودداری می کند
جایگزین شد؛ بنابراین به عنوان مثال این پس از اولین تکرار متوقف می شود، به جای
مسیر خود را به سمت عقب از طریق رشته تکرار می کند:
$_ = "123456789";
pos = 6;
s/.(?=.\G)/X/g;
چاپ؛ # 1234X6789 چاپ می کند، نه XXXXX6789
گرفتن گروه
ساختار براکتینگ "(...)" گروه های ضبط را ایجاد می کند (که به آن capture نیز می گویند
بافرها). برای مراجعه به محتویات فعلی یک گروه بعداً در همان الگو،
از "\g1" (یا "\g{1}") برای اول، "\g2" (یا "\g{2}") برای دوم و غیره استفاده کنید. این
نامیده می شود ارجاع به عقب.
هیچ محدودیتی برای تعداد زیر رشته های ضبط شده ای که می توانید استفاده کنید وجود ندارد. گروه ها هستند
شماره گذاری شده با باز بودن پرانتز سمت چپ، شماره 1، و غیره. اگر گروهی این کار را نکرد
مطابقت داشته باشد، مرجع بازگشتی مرتبط نیز مطابقت نخواهد داشت. (این می تواند اتفاق بیفتد اگر گروه باشد
اختیاری، یا در شاخه دیگری از یک تناوب.) می توانید "g" را حذف کرده و بنویسید
"\1"، و غیره، اما مشکلاتی در این فرم وجود دارد که در زیر توضیح داده شده است.
همچنین می توانید با استفاده از عدد منفی به گروه های عکس برداری نسبتاً مراجعه کنید تا
"\g-1" و "\g{-1}" هر دو به گروه ضبط بلافاصله قبل و "\g-2" و
"\g{-2}" هر دو به گروه قبل از آن اشاره دارد. مثلا:
/
(Y) # گروه 1
(# گروه 2
(X) # گروه 3
\g{-1} # بازگشت به گروه 3
\g{-3} # بازگشت به گروه 1
)
/x
مطابق با "/(Y) ( (X) \g3 \g1 )/x". این به شما این امکان را می دهد که رجکس ها را درون یابی کنید
را به regexeهای بزرگتر تبدیل کنید و نگران شماره گذاری مجدد گروه های ضبط نباشید.
شما می توانید به طور کلی اعداد را کنار بگذارید و گروه های ضبط نامی ایجاد کنید. علامت گذاری است
"(؟نام>...)" برای اعلام و "\g{نام}" به مرجع. (برای سازگاری با Net
عبارات منظم، "\g{نام}" همچنین ممکن است به صورت "\k{" نوشته شودنام}"، "\kنام>" or
"\k"نام'".) نام نباید با یک عدد شروع شود و یا حاوی خط تیره نباشد. وقتی متفاوت است
گروه های درون یک الگو دارای نام یکسانی هستند، هر ارجاع به آن نام این را فرض می کند
سمت چپ ترین گروه تعریف شده گروههای نامگذاری شده در شمارهگذاری مطلق و نسبی شمارش میشوند و همینطور میتوانند
همچنین با آن اعداد اشاره می شود. (امکان انجام کارها با ضبط نام دار وجود دارد
گروه هایی که در غیر این صورت به "(??{})" نیاز دارند.)
محتویات گروه ضبط به صورت پویا دارای دامنه هستند و خارج از الگو در دسترس شما هستند
تا پایان بلوک محصور یا تا بازی موفق بعدی، هر کدام که پیش آید
اولین. (به "گزاره های مرکب" در perlsyn مراجعه کنید.) می توانید با عدد مطلق به آنها مراجعه کنید
(با استفاده از "$1" به جای "\g1"، و غیره)؛ یا با نام از طریق هش "%+"، با استفاده از "$+{نام}".
بریسها برای اشاره به گروههای ضبط نامگذاری شده مورد نیاز هستند، اما برای مطلق یا اختیاری هستند
شماره های نسبی بریس ها هنگام ایجاد رگکس با به هم پیوستن کوچکتر ایمن تر هستند
رشته های. به عنوان مثال، اگر "qr/$a$b/" دارید، و $a حاوی "\g1"، و $b حاوی
"37"، شما "/\g137/" را دریافت خواهید کرد که احتمالاً آن چیزی نیست که قصد دارید.
نمادهای "\g" و "\k" در Perl 5.10.0 معرفی شدند. قبل از آن وجود نداشت
گروههای ضبط نامگذاری شده یا شمارهدار نسبی. به گروه های اعداد مطلق اشاره شد
با استفاده از "\1"، "\2"، و غیره، و این نماد هنوز پذیرفته شده است (و احتمالا همیشه خواهد بود).
اما اگر بیش از 9 گروه ضبط وجود داشته باشد، به برخی ابهامات منجر می شود، زیرا "\10" می تواند
به معنای دهمین گروه تسخیر یا شخصیتی است که ترتیب آن در اکتال 010 است (a
بک اسپیس در اسکی). پرل این ابهام را با تفسیر "\10" به عنوان یک حل می کند
تنها در صورتی که حداقل 10 پرانتز سمت چپ قبل از آن باز شده باشد، مرجع برگشتی است. به همین ترتیب "\11"
تنها در صورتی که حداقل 11 پرانتز چپ قبل از آن باز شده باشد، یک مرجع برگشتی است. و غیره.
"\1" تا "\9" همیشه به عنوان ارجاع به عقب تفسیر می شوند. چند نمونه وجود دارد
در زیر که این خطرات را نشان می دهد. شما می توانید با استفاده از "\g{}" یا همیشه از ابهام جلوگیری کنید
"\g" اگر منظور شما گرفتن گروه هاست. و برای ثابت های هشتی همیشه از "\o{}" یا برای استفاده می کنند
"\077" و پایین تر، با استفاده از 3 رقم پر شده با صفرهای ابتدایی، زیرا صفر اول دلالت دارد
یک ثابت هشتی
"\رقم" علامت گذاری نیز در شرایط خاصی خارج از الگو کار می کند. دیدن
"هشدار در مورد \1 به جای $1" در زیر برای جزئیات.
مثال:
s/^([^ ]*) *([^ ]*)/$2 $1/; # دو کلمه اول را عوض کنید
/(.)\g1/ # اولین کاراکتر دو برابر شده را پیدا کنید
و چاپ کنید "'$1' اولین کاراکتر دو برابر شده\n" است.
/(؟ .)\k / # ... روشی متفاوت
و چاپ "$+{char}" اولین کاراکتر دو برابر شده\n است.
/(?'char'.)\g1/ # ... ترکیب و مطابقت
و چاپ کنید "'$1' اولین کاراکتر دو برابر شده\n" است.
if (/Time: (..):(..):(..)/) { # مقادیر را تجزیه کنید
$hours = $1;
دقیقه دلار = 2 دلار؛
$ثانیه = 3$;
}
/(.)(.)(.)(.)(.)(.)(.)(.)(.)\g10/ # \g10 یک مرجع برگشتی است
/(.)(.)(.)(.)(.)(.)(.)(.)(.)\10/ # \10 هشتی است
/((.)(.)(.)(.)(.)(.)(.)(.)(.))\10/ # \10 یک مرجع برگشتی است
/((.)(.)(.)(.)(.)(.)(.)(.)(.))\010/ # \010 هشتی است
$a = '(.)\1'; # هنگام الحاق مشکل ایجاد می کند.
$b = '(.)\g{1}'; # از مشکلات جلوگیری می کند.
"aa" =~ /${a}/; # درست است، واقعی
"aa" =~ /${b}/; # درست است، واقعی
"aa0" =~ /${a}0/; #کاذب!
"aa0" =~ /${b}0/; # درست است، واقعی
"aa\x08" =~ /${a}0/; # درست است، واقعی!
"aa\x08" =~ /${b}0/; #کاذب
چندین متغیر خاص نیز به بخشهایی از مسابقه قبلی برمیگردند. $+ برمیگرداند
هر چه آخرین براکت مطابقت داشت. $& کل رشته منطبق را برمی گرداند. (در یک
نقطه $0 نیز انجام داد، اما اکنون نام برنامه را برمی گرداند.) "$`" همه چیز را برمی گرداند
قبل از رشته همسان "$" همه چیز را پس از رشته مطابقت داده شده برمی گرداند. و $^N
حاوی هر چیزی است که با گروهی که اخیرا بسته شده است (تطابق فرعی) مطابقت داده شده است. $^N می تواند باشد
در الگوهای توسعه یافته (به زیر مراجعه کنید)، به عنوان مثال برای تخصیص یک تطابق فرعی به یک متغیر استفاده می شود.
این متغیرهای خاص، مانند هش "%+" و متغیرهای مطابق شماره ($1، $2، $3،
و غیره) به صورت پویا تا انتهای بلوک محصور یا تا مرحله بعدی محدوده می شوند
مسابقه موفق، هر کدام که اول شود. (به "گزاره های مرکب" در perlsyn مراجعه کنید.)
توجه داشته باشید: مطابقت های ناموفق در پرل، متغیرهای تطابق را بازنشانی نمی کنند، که این کار را آسان تر می کند
کدی بنویسید که یک سری موارد خاص تر را آزمایش کند و بهترین تطابق را به خاطر بسپارد.
هشدار: اگر قرار است کد شما روی Perl 5.16 یا قبل از آن اجرا شود، مراقب باشید زمانی که Perl آن را مشاهده کرد
شما به یکی از $&، "$`"، یا "$" در هر جایی از برنامه نیاز دارید، باید آنها را برای
هر الگوی مطابقت دارد این ممکن است به طور قابل توجهی برنامه شما را کند کند.
پرل از همان مکانیسم برای تولید 1 دلار، 2 دلار و غیره استفاده می کند، بنابراین شما نیز برای هر کدام بهایی می پردازید
الگویی که حاوی پرانتز است. (برای جلوگیری از این هزینه با حفظ
رفتار گروه بندی، به جای آن از عبارت منظم توسعه یافته "(?: ... )" استفاده کنید.) اما اگر شما
هرگز از $&، "$`" یا "$" و سپس الگوها استفاده نکنید بدون گرفتن پرانتز نخواهد بود
جریمه شد بنابراین اگر میتوانید از $&، "$"، و "$" اجتناب کنید، اما اگر نمیتوانید (و برخی از الگوریتمها
واقعاً از آنها قدردانی کنید)، وقتی یک بار از آنها استفاده کردید، به میل خود از آنها استفاده کنید، زیرا این کار را کرده اید
قبلاً بهای آن را پرداخته است
Perl 5.16 مکانیزم کمی کارآمدتر را معرفی کرد که به طور جداگانه به این موضوع اشاره می کند که آیا
هر یک از "$`"، $&، و "$" دیده شده اند، و بنابراین ممکن است فقط نیاز به کپی کردن بخشی از
رشته Perl 5.20 مکانیزم کپی در نوشتن بسیار کارآمدتر را معرفی کرد که
هر گونه کندی را از بین می برد.
به عنوان راه حل دیگری برای این مشکل، Perl 5.10.0 "${^PREMATCH}"، "${^MATCH}" را معرفی کرد.
و "${^POSTMATCH}"، که معادل "$`"، $& و "$'" هستند، جز که آنها فقط هستند
تضمین شده است که پس از یک مسابقه موفقیت آمیز که با "/p" اجرا شد، تعریف می شود.
(حفظ) اصلاح کننده. استفاده از این متغیرها هیچ جریمه عملکرد جهانی را در پی ندارد،
برخلاف معادلهای نشانهگذاری آنها، با این حال در مبادلهای که باید بگویید
perl زمانی که می خواهید از آنها استفاده کنید. از پرل 5.20، این سه متغیر معادل هستند
"$`"، $& و "$'"، و "/p" نادیده گرفته می شود.
نقل قول متاکاراکترها
متاکاراکترهای اسلش شده در Perl حروف عددی هستند، مانند "\b"، "\w"، "\n". بر خلاف
برخی دیگر از زبانهای عبارت معمولی، هیچ نمادی وجود ندارد که اینطور نیست
حروف عددی بنابراین هر چیزی که شبیه \\، \(، \)، \[، \]، \{ یا \} باشد همیشه است
به عنوان یک شخصیت تحت اللفظی تفسیر می شود، نه یک متاخصیت. این یک بار در یک مشترک استفاده می شد
اصطلاح برای غیرفعال کردن یا نقل قول معانی خاص متاکاراکترهای عبارت منظم در a
رشته ای که می خواهید برای الگو استفاده کنید. به سادگی تمام کاراکترهای غیر "کلمه" را نقل قول کنید:
$pattern =~ s/(\W)/\\$1/g;
(اگر "استفاده از محلی" تنظیم شده باشد، این بستگی به منطقه فعلی دارد.) امروز بیشتر است
رایج برای استفاده از quotemeta() تابع یا دنباله فرار فرا نقل قول "\Q" را غیرفعال کنید
معانی ویژه همه متاکاراکترها مانند این است:
/$unquoted\Q$quoted\E$unquoted/
مراقب باشید که اگر بک اسلش های تحت اللفظی قرار دهید (آنهایی که داخل متغیرهای درون یابی نیستند)
بین "\Q" و "\E"، درون یابی بک اسلش دوگانه ممکن است منجر به گیج کننده شود
نتایج. اگر شما نیاز برای استفاده از بک اسلش تحت اللفظی در "\Q...\E"، به "جزئیات گوری" مراجعه کنید
تجزیه ساختارهای نقلشده» در پرلوپ.
"quotemeta()" و "\Q" به طور کامل در "quotemeta" در perlfunc توضیح داده شده است.
تمدید شده الگوهای
Perl همچنین برای ویژگیهایی که در ابزارهای استاندارد یافت نمیشوند، یک دستور فرمت سازگار تعریف میکند
حرفه ای بیدار و سافلکس. نحو اکثر اینها یک جفت پرانتز با یک سوال است
به عنوان اولین چیز در داخل پرانتز علامت بزنید. شخصیت بعد از علامت سوال
پسوند را نشان می دهد.
پایداری این پسوندها بسیار متفاوت است. برخی از آنها بخشی از زبان اصلی بوده اند
برای چندین سال برخی دیگر آزمایشی هستند و ممکن است بدون هشدار یا کاملاً تغییر کنند
حذف شده. اسناد مربوط به یک ویژگی فردی را بررسی کنید تا وضعیت فعلی آن را تأیید کنید.
یک علامت سوال برای این و برای ساختار با حداقل تطابق انتخاب شد زیرا 1)
علامت سوال در عبارات منظم قدیمی نادر است، و 2) هر زمان که یکی را می بینید، شما
باید متوقف شود و دقیقاً آنچه را که در حال وقوع است «سوال کند». روانشناسی همینه....
"(?#متن)"
یک نظر. متن نادیده گرفته شده است. توجه داشته باشید که پرل نظر را به محض مشاهده می بندد
یک ")"، بنابراین راهی برای قرار دادن ")" تحت اللفظی در نظر وجود ندارد. الگو در حال بسته شدن است
اگر جداکننده در نظر ظاهر شود باید با علامت بک اسلش فرار کند.
برای راه دیگری برای داشتن نظرات در الگوها به "/x" مراجعه کنید.
"(?adlupimnsx-imnsx)"
"(?^alupimnsx)"
یک یا چند اصلاحکننده تطبیق الگوی تعبیهشده، که باید روشن شوند (یا خاموش شوند، اگر
قبل از "-") برای باقیمانده الگو یا باقی مانده از محصور
گروه الگو (در صورت وجود).
این به ویژه برای الگوهای پویا، مانند الگوهای خوانده شده از a مفید است
فایل پیکربندی، از یک آرگومان گرفته شده یا در یک جدول در جایی مشخص شده است.
موردی را در نظر بگیرید که در آن برخی از الگوها می خواهند به حروف بزرگ و کوچک حساس باشند و برخی نه: The
مواردی که به حروف بزرگ و کوچک حساس نیستند فقط باید "(?i)" را در جلوی الگو قرار دهند. برای
مثال:
$pattern = "foobar";
if (/$pattern/i ) { }
# انعطاف پذیرتر:
$pattern = "(?i)foobar";
if ( /$pattern/ ) { }
این اصلاح کننده ها در انتهای گروه احاطه کننده بازیابی می شوند. مثلا،
( (?i) blah ) \s+ \g1
در هر صورت، برخی از فضاها، و دقیق (شامل la مورد!)
تکرار کلمه قبلی با فرض تغییر دهنده "/x" و بدون تغییر "/i"
خارج از این گروه
این اصلاحکنندهها به زیر الگوهای نامگذاریشده که در محفظه خوانده میشوند منتقل نمیشوند
گروه به عبارت دیگر، الگویی مانند "((?i)(?&NAME))" حروف بزرگ را تغییر نمی دهد.
حساسیت الگوی "NAME".
هر یک از این اصلاح کننده ها را می توان به گونه ای تنظیم کرد که به صورت سراسری برای همه عبارات منظم اعمال شود
در محدوده یک "استفاده مجدد" وارد شده است. به «حالت '/پرچمها» در re مراجعه کنید.
شروع در Perl 5.14، یک "^" (لهجه caret یا circumflex) بلافاصله بعد از "?" است
خلاصه ای معادل "d-imnsx". پرچمها (به جز "d") ممکن است از بند پیروی کنند
نادیده گرفتن آن اما علامت منفی با آن قانونی نیست.
توجه داشته باشید که اصلاح کننده های "a"، "d"، "l"، "p" و "u" از این جهت خاص هستند که فقط می توانند
فعال باشد، غیرفعال نباشد، و اصلاح کننده های "a"، "d"، "l" و "u" متقابل هستند
انحصاری: مشخص کردن یکی، بقیه را غیر مشخص می کند و حداکثر یک (یا دو "a")
ممکن است در ساختار ظاهر شود. بنابراین، برای مثال، "(?-p)" هنگامی که در زیر کامپایل شود هشدار می دهد
"استفاده از هشدارها"؛ "(?-d:...)" و "(?dl:...)" خطاهای مرگبار هستند.
همچنین توجه داشته باشید که اصلاحکننده «p» از این نظر خاص است که در هر جایی از الگو وجود دارد
اثر جهانی دارد.
"(؟:الگو)"
"(?adluimnsx-imnsx:pattern)"
"(?^aluimnsx:pattern)"
این برای خوشه بندی است، نه گرفتن. عبارات فرعی مانند "()" را گروه بندی می کند، اما این کار را نمی کند
همانطور که "()" انجام می دهد، ارجاعات برگشتی ایجاد کنید. بنابراین
@fields = split(/\b(?:a|b|c)\b/)
مثل این است
@fields = split(/\b(a|b|c)\b/)
اما زمینه های اضافی را تف نمی دهد. همچنین اگر میخواهید شخصیتها را جذب نکنید، ارزانتر است
نیازی نیست
هر حرفی بین "?" و ":" مانند "(?adluimnsx-imnsx)" به عنوان اصلاح کننده پرچم عمل می کنند.
به عنوان مثال،
/(?si:بیشتر.*از).*میلیون/من
معادل پرمخاطره تر است
/(?:(?si)بیشتر.*از).*میلیون/من
توجه داشته باشید که هر ساختار "(...)" محصور در این یکی همچنان ضبط می شود مگر اینکه
اصلاح کننده "/n" در حال اجرا است.
شروع در Perl 5.14، یک "^" (لهجه caret یا circumflex) بلافاصله بعد از "?" است
خلاصه ای معادل "d-imnsx". هر پرچم مثبت (به جز "d") ممکن است به دنبال آن باشد
مراقبت، بنابراین
(?^x:foo)
برابر است با
(?x-imns:foo)
کارت به پرل میگوید که این خوشه پرچمهای هیچ محیطی را به ارث نمیبرد
الگو، اما از پیشفرضهای سیستم ("d-imnsx") استفاده میکند که با هر پرچم مشخص شده اصلاح شده است.
Caret امکان رشته بندی ساده تر عبارات منظم کامپایل شده را فراهم می کند. اینها
شبیه
(?^:الگو)
با هر پرچم غیر پیش فرضی که بین کارت و کولون ظاهر می شود. تستی که
به چنین رشتهبندی نگاه میکند، بنابراین نیازی به داشتن پرچمهای پیشفرض سیستم سخت نیست.
کدگذاری شده در آن، فقط حوضچه. اگر پرچمهای جدیدی به Perl اضافه شوند، معنی
بسط caret تغییر میکند تا پیشفرض آن پرچمها را شامل شود، بنابراین آزمایش انجام میشود
هنوز کار می کند، بدون تغییر
مشخص کردن یک پرچم منفی بعد از caret یک خطا است، زیرا پرچم اضافی است.
یادگاری برای "(?^...)": شروعی تازه از آنجایی که استفاده معمولی از کرت مطابقت است
در آغاز.
"(?|الگو)"
این الگوی "بازنشانی شاخه" است که دارای خاصیت ویژه ای است که ضبط می کند
گروه ها از یک نقطه شروع در هر شاخه متناوب شماره گذاری می شوند. این است
از پرل 5.10.0 در دسترس است.
گروههای کپچر از چپ به راست شمارهگذاری میشوند، اما در داخل این ساختار، شمارهگذاری میشود
شماره گذاری برای هر شاخه دوباره شروع می شود.
شماره گذاری در هر شعبه و هر گروهی که از آن پیروی می کند، عادی خواهد بود
ساختار به گونهای شمارهگذاری میشود که گویی ساختار فقط یک شاخه دارد، آن
یکی از گروه هایی است که بیشترین تسخیر را در خود دارد.
این ساختار زمانی مفید است که می خواهید یکی از تعدادی جایگزین را بگیرید
مسابقات.
الگوی زیر را در نظر بگیرید. اعداد زیر نشان می دهد که در کدام گروه است
محتوای ضبط شده ذخیره خواهد شد.
# قبل از ---------------بازنشانی شاخه------------ بعد از
/ (a) (?| x (y) z | (p (q) r) | (t) u (v)) (z) /x
# 1 2 2 3 2 3 4
هنگام استفاده از الگوی بازنشانی شاخه در ترکیب با عکس های نامگذاری شده مراقب باشید.
ضبطهای نامگذاری شده بهعنوان نام مستعار برای گروههای شمارهگذاریشده اجرا میشوند
ضبط می کند، و این در اجرای الگوی بازنشانی شاخه اختلال ایجاد می کند. اگر
شما از عکسهای نامگذاری شده در الگوی بازنشانی شاخه استفاده میکنید، بهتر است از آن استفاده کنید
اسامی، به ترتیب یکسان، در هر یک از تناوب:
/(?| (? x) (? y)
| (? z) (? w )) /x
عدم انجام این کار ممکن است منجر به شگفتی شود:
"12" =~ /(?| (? \d+ ) | (? \D+))/x;
بگویید $+ {a}; # چاپ '12'
بگویید $+ {b}; # *همچنین* '12' را چاپ می کند.
مشکل اینجاست که هم گروهی به نام "a" و هم گروهی به نام "b" نام مستعار هستند
برای گروه متعلق به $1.
نگاه به اطراف ادعاها
ادعاهای نگاه به اطراف، الگوهایی با عرض صفر هستند که با یک الگوی خاص مطابقت دارند
از جمله آن در $&. اظهارات مثبت زمانی مطابقت دارند که زیرالگوی آنها منطبق باشد، منفی
اظهارات زمانی مطابقت دارند که الگوی فرعی آنها شکست بخورد. نگاه به پشت، متن را تا
موقعیت تطبیق فعلی، متنی که به دنبال موقعیت مسابقه فعلی است مطابقت دارد.
"(?=الگو)"
یک ادعای آینده نگر مثبت با عرض صفر. برای مثال، "/\w+(?=\t)/" با a مطابقت دارد
کلمه به دنبال آن یک برگه، بدون درج تب در $&.
"(؟!الگو)"
یک ادعای پیش رو منفی با عرض صفر. برای مثال "/foo(?!bar)/" مطابقت دارد
هر رخداد "فو" که "بار" به دنبال آن نباشد. با این حال توجه داشته باشید که نگاه کنید-
جلو و نگاه کردن یکسان نیستند. شما نمی توانید از این برای نگاه کردن استفاده کنید -
پشت.
اگر به دنبال یک "نوار" هستید که قبل از "فو" نباشد، "/(?!foo)bar/" خواهد شد.
آنچه را که می خواهی انجام نده این به این دلیل است که "(؟!foo)" فقط می گوید که بعدی
چیزی نمی تواند "فو" باشد - و اینطور نیست، "نوار" است، بنابراین "فوبار" مطابقت دارد. استفاده کنید
به جای آن به پشت سر نگاه کنید (به زیر مراجعه کنید).
"(?<=الگو)" "\K"
یک ادعای پشت سر مثبت با عرض صفر. به عنوان مثال، "/(?<=\t)\w+/" مطابقت دارد
کلمه ای که به دنبال یک برگه می آید، بدون اینکه برگه را در $& لحاظ کند. فقط برای ثابت کار می کند-
عرض نگاه به پشت.
شکل خاصی از این ساختار وجود دارد به نام "\K" (از زمان Perl موجود است
5.10.0)، که باعث می شود موتور regex همه چیزهایی را که قبلا مطابقت داده بود "نگهداری" کند
به "\K" و آن را در $& وارد نکنید. این به طور موثر طول متغیر را فراهم می کند
به عقب نگاه کن. استفاده از "\K" در داخل یک ادعای نگاه به اطراف دیگر مجاز است،
اما رفتار در حال حاضر به خوبی تعریف نشده است.
به دلایل مختلف "\K" ممکن است به طور قابل توجهی کارآمدتر از معادل باشد
"(?<=...)" ساخته می شود، و به ویژه در موقعیت هایی که می خواهید مفید است
به طور موثر چیزی را به دنبال چیز دیگری در یک رشته حذف کنید. برای مثال
s/(foo)bar/$1/g;
را می توان به عنوان بسیار کارآمدتر بازنویسی کرد
s/foo\Kbar//g;
"(؟
یک ادعای پشت سر نگاه منفی با عرض صفر. مثلا "/(؟
هر رخداد «فو» که از «بار» پیروی نمی کند. فقط برای عرض ثابت کار می کند
به عقب نگاه کن.
"(?'NAME'pattern)"
"(؟ الگو)"
یک گروه ضبط به نام از هر لحاظ با پرانتزهای معمولی "()" یکسان است
اما برای این واقعیت اضافی که گروه را می توان با نام در موارد مختلف اشاره کرد
ساختارهای عبارت منظم (مانند "\g{NAME}") و با نام بعد از a قابل دسترسی است
مطابقت موفق از طریق "%+" یا "%-". برای جزئیات بیشتر در مورد "%+" و "%-" به perlvar مراجعه کنید.
هش ها
اگر چندین گروه مجزای تصویربرداری یک نام داشته باشند، $+{NAME} به آن اشاره خواهد کرد
چپ ترین گروه تعریف شده در مسابقه.
اشکال "(?'NAME'pattern)" و "(? الگو)" معادل هستند.
توجه: در حالی که علامت گذاری این ساختار همانند تابع مشابه در دات نت است
reexes، رفتار نیست. در پرل گروه ها بدون توجه به ترتیب شماره گذاری می شوند
نام بردن یا نبودن بنابراین در الگو
/(ایکس)(؟ y)(z)/
$+{foo} همان $2 خواهد بود و $3 به جای عکس آن حاوی "z" خواهد بود
چیزی است که یک هکر regex دات نت ممکن است انتظار داشته باشد.
در حال حاضر NAME فقط به شناسه های ساده محدود شده است. به عبارت دیگر باید
مطابق با "/^[_A-Za-z][_A-Za-z0-9]*\z/" یا پسوند یونیکد آن (به utf8 مراجعه کنید)،
بوسیله منطقه گسترش نمی یابد (به perllocale مراجعه کنید).
توجه: به منظور آسان کردن کار برای برنامه نویسان با تجربه با پایتون
یا موتورهای regex PCRE، الگوی "(?P الگو)" ممکن است به جای استفاده شود
"(؟ الگو)"؛ اما این فرم استفاده از نقل قول های تک را به عنوان الف پشتیبانی نمی کند
جداکننده برای نام
"\k "
"\k'NAME"
به نام مرجع. مشابه ارجاعات پشتی عددی است، با این تفاوت که گروه است
با نام و نه شماره مشخص شده است. اگر چندین گروه دارای نام یکسانی هستند، آن را
به سمت چپ ترین گروه تعریف شده در مسابقه فعلی اشاره دارد.
ارجاع به نامی که با "(? )" در الگوی قبلی.
هر دو شکل معادل هستند.
توجه: به منظور آسان کردن کار برای برنامه نویسان با تجربه با پایتون
یا موتورهای رگکس PCRE، الگوی «(?P=NAME)» ممکن است به جای «\k» استفاده شود ".
"(?{ کد })"
هشدار: استفاده ایمن از این ویژگی مستلزم درک محدودیت های آن است. کد
اجرا شده که دارای عوارض جانبی است ممکن است از نسخه ای به نسخه دیگر یکسان عمل نکند
به تأثیر بهینه سازی های آینده در موتور regex. برای اطلاعات بیشتر در
این را ببینید "فرکانس اجرای کد تعبیه شده".
این ادعای عرض صفر هر کد پرل تعبیه شده را اجرا می کند. همیشه موفق می شود و
مقدار بازگشتی آن به صورت $^R تنظیم شده است.
در الگوهای تحت اللفظی، کد همزمان با کد اطراف تجزیه می شود.
در حالی که در داخل الگو است، کنترل به طور موقت به تجزیه کننده پرل باز می گردد، تا زمانی که
مهاربند بسته شدن متعادل کننده منطقی مواجه می شود. این شبیه به این روش است
برای مثال، یک عبارت شاخص آرایه در یک رشته تحت اللفظی مدیریت می شود
"abc$array[ 1 + f('[') + g()]def"
به ویژه، بریس ها نیازی به متعادل شدن ندارند:
s/abc(?{ f('{'); })/def/
حتی در الگویی که در زمان اجرا درون یابی و کامپایل می شود، بلوک های کد تحت اللفظی
یک بار در زمان کامپایل پرل کامپایل خواهد شد. موارد زیر "ABCD" را چاپ می کند:
چاپ "D"؛
my $qr = qr/(?{ BEGIN { print "A" } })/;
my $foo = "foo";
/$foo$qr(?{ BEGIN { print "B" } })/;
BEGIN { چاپ "C" }
در الگوهایی که متن کد از اطلاعات زمان اجرا مشتق شده است
به جای اینکه به معنای واقعی کلمه در یک کد منبع / الگو / ظاهر شود، کد در همان زمان کامپایل می شود
زمانی که الگو کامپایل میشود، و به دلایل امنیتی، باید از re 'eval' استفاده شود
در محدوده باشد. این کار برای جلوگیری از الگوهای ارائه شده توسط کاربر حاوی قطعه کد از
قابل اجرا بودن
در مواقعی که باید این را با "use re 'eval" فعال کنید، باید این کار را نیز داشته باشید
بررسی لکه ها فعال شد بهتر از آن، از ارزیابی با دقت محدود در a استفاده کنید
محفظه ایمن برای جزئیات بیشتر در مورد هر دو مکانیسم، به perlsec مراجعه کنید.
از دیدگاه تجزیه، دامنه متغیر واژگانی و بسته شدن،
/AAA(?{ BBB })CCC/
تقریبا شبیه
/AAA/ && انجام { BBB } && /CCC/
به طور مشابه،
qr/AAA(?{ BBB })CCC/
تقریبا شبیه
زیر { /AAA/ && انجام { BBB } && /CCC/ }
به خصوص:
{ $i من = 1; $r = qr/(?{ print $i })/ }
من $i = 2;
/$r/; # چاپ "1"
در داخل بلوک "(?{...})" $_ به رشته ای اشاره دارد که عبارت منظم با آن مطابقت دارد
در برابر. شما همچنین می توانید از "pos()" استفاده کنید تا بدانید موقعیت فعلی تطبیق چیست
در این رشته
بلوک کد دامنه جدیدی را از منظر متغیر واژگانی معرفی می کند
اعلامیه ها، اما نه از منظر بومی سازی «محلی» و مشابه
رفتار. بنابراین بلوک های کد بعدی در همان الگو همچنان مقادیر را می بینند
که در بلوک های قبلی بومی سازی شده بودند. این محلی سازی های انباشته شده لغو شده اند
یا در پایان یک مسابقه موفق، یا اگر ادعا به عقب برگشت (مقایسه کنید
"بازگشت"). مثلا،
$_ = 'a' x 8;
m<
(?{ $cnt = 0 }) # $cnt را مقداردهی کنید.
(
a
(؟{
محلی $cnt = $cnt + 1; # بهروزرسانی $cnt،
# ایمن عقبگرد.
})
)*
AAAA
(?{ $res = $cnt }) # در موفقیت کپی به
# مکان غیر محلی.
> x;
در ابتدا cnt $ را تا 8 افزایش می دهد. سپس در حین عقب نشینی، مقدار آن خواهد بود
بازگرداندن به 4، که مقدار اختصاص داده شده به $res است. در پایان regex
اجرا، $cnt به مقدار اولیه 0 باز می گردد.
این ادعا ممکن است به عنوان شرط در الف استفاده شود
(?(شرط)بله-الگو|نه-الگو)
تعویض. اگر نه با استفاده از این روش، نتیجه ارزیابی «کد» در آن قرار می گیرد
متغیر ویژه $^R. این بلافاصله اتفاق می افتد، بنابراین $^R را می توان از سایر "(?{) استفاده کرد.
کد })" در داخل همان عبارت منظم.
انتساب به $^R در بالا به درستی بومی سازی شده است، بنابراین مقدار قدیمی $^R بازیابی می شود
اگر ادعا به عقب برگشت؛ "بازگشت" را مقایسه کنید.
توجه داشته باشید که متغیر ویژه $^N مخصوصاً برای گرفتن بلوک های کد مفید است
نتایج مسابقات فرعی در متغیرها بدون نیاز به پیگیری تعداد
پرانتز تو در تو مثلا:
$_ = "روباه قهوه ای از روی سگ تنبل می پرد";
/the (\S+)(?{ $color = $^N }) (\S+)(?{ $animal = $^N })/i;
چاپ "color = $color, animal = $animal\n";
"(??{ کد })"
هشدار: استفاده ایمن از این ویژگی مستلزم درک محدودیت های آن است. کد
اجرا شده که دارای عوارض جانبی است ممکن است از نسخه ای به نسخه دیگر یکسان عمل نکند
به تأثیر بهینه سازی های آینده در موتور regex. برای اطلاعات بیشتر در
این را ببینید "فرکانس اجرای کد تعبیه شده".
این یک عبارت فرعی منظم "به تعویق افتاده" است. در رفتار می کند کاملا به همان روشی که a
بلوک کد "(?{ کد })" همانطور که در بالا توضیح داده شد، با این تفاوت که مقدار بازگشتی آن به جای
به $^R اختصاص داده می شود، به عنوان یک الگو در نظر گرفته می شود، اگر یک رشته باشد (یا به عنوان استفاده می شود) کامپایل می شود
اگر یک شیء qr// باشد)، سپس به گونه ای مطابقت داده می شود که گویی به جای این درج شده است
ساختن.
در طول تطبیق این الگوی فرعی، مجموعه ای از عکس های خود را دارد که عبارتند از
در طول مسابقه فرعی معتبر است، اما پس از بازگشت کنترل به بازی اصلی حذف می شوند
الگو. به عنوان مثال، موارد زیر مطابقت دارند، با الگوی درونی که "B" و
مطابق با "BB"، در حالی که الگوی بیرونی "A" را نشان می دهد.
my $inner = '(.)\1';
"ABBA" =~ /^(.)(??{ $inner })\1/;
چاپ 1 دلار؛ # چاپ "A"؛
توجه داشته باشید که این بدان معنی است که هیچ راهی برای الگوی داخلی برای اشاره به یک گرفتن وجود ندارد
گروه تعریف شده در خارج (خود بلوک کد می تواند از $1 و غیره برای مراجعه به آن استفاده کند
گروه های ضبط الگو را در بر می گیرد.) بنابراین، اگرچه
('a' x 100)=~/(??{'(.)' x 100})/
اراده مطابقت دارد نه $1 را در هنگام خروج تنظیم کنید.
الگوی زیر با یک گروه پرانتز مطابقت دارد:
$re = qr{
\(
(?:
(?> [^()]+ ) # غیر پرنس بدون عقب نشینی
|
(??{ $re }) # گروه با پرانتز منطبق
)*
\)
}ایکس؛
همچنین ببینید "(?پارنو)" برای یک روش متفاوت و کارآمدتر برای انجام همان کار.
اجرای یک عبارت منظم به تعویق افتاده 50 بار بدون مصرف هیچ رشته ورودی
منجر به یک خطای کشنده خواهد شد. حداکثر عمق در پرل کامپایل شده است، بنابراین آن را تغییر دهید
نیاز به ساخت سفارشی دارد.
"(؟پارنو)" "(؟-PARNO)" "(?+PARNO)" "(?R)" "(?0)"
الگوی فرعی بازگشتی محتویات یک بافر ضبط داده شده را در جریان پردازش کنید
الگو به عنوان یک الگوی فرعی مستقل و تلاش برای مطابقت با آن در موقعیت فعلی
در رشته اطلاعات مربوط به وضعیت ضبط از تماس گیرنده برای مواردی مانند
ارجاعات برگشتی برای زیر الگو در دسترس است، اما بافرهای تنظیم شده توسط
الگوهای فرعی برای تماس گیرنده قابل مشاهده نیستند.
مشابه "(??{ کد })" با این تفاوت که شامل اجرای هیچ کد یا کدی نمی شود
به طور بالقوه کامپایل یک رشته الگوی برگشتی. در عوض آن بخش از
الگوی فعلی موجود در یک گروه ضبط مشخص به عنوان یک الگوی مستقل
که باید در موقعیت فعلی مطابقت داشته باشد. همچنین درمان گرفتن متفاوت است
بافرها، برخلاف الگوهای بازگشتی "(??{ code })" به مطابقت تماس گیرندگان خود دسترسی دارند.
وضعیت، بنابراین می توان با خیال راحت از مراجع برگشتی استفاده کرد.
PARNO دنبالهای از ارقام است (با 0 شروع نمیشود) که مقدار آن منعکسکننده واریس است.
شماره گروه ضبط برای بازگشت به. "(?R)" به ابتدای صفحه باز می گردد
الگوی کامل "(?0)" یک نحو جایگزین برای "(?R)" است. اگر PARNO قبل از یک
علامت مثبت یا منفی آن نسبی فرض می شود و اعداد منفی نشان می دهند
گروه های ضبط قبلی و گروه های مثبت زیر. بنابراین "(?-1)" به بیشترین اشاره دارد
گروهی که اخیراً اعلام شده است، و "(?+1)" گروه بعدی را نشان می دهد که باید اعلام شود. توجه داشته باشید
که شمارش بازگشت نسبی با ارجاعات برگشتی نسبی متفاوت است،
در آن با بازگشت گروه های بسته نشده است هستند گنجانده شده است.
الگوی زیر با یک تابع مطابقت دارد فو () که ممکن است حاوی پرانتزهای متعادل باشد
به عنوان استدلال.
$re = qr{ ( # گروه اصلی 1 (تابع کامل)
فو
( # گروه والد 2 (والدین)
\(
( # گروه والد 3 (محتویات والدین)
(?:
(?> [^()]+ ) # غیر پرنس بدون عقب نشینی
|
(?2) # بازگشت به شروع گروه والد 2
)*
)
\)
)
)
}ایکس؛
اگر از الگوی زیر استفاده می شد
'foo(bar(baz)+baz(bop))'=~/$re/
و چاپ "\$1 = $1\n"،
"\$2 = $2\n"،
"\$3 = $3\n";
خروجی تولید شده باید به صورت زیر باشد:
1 دلار = فوو (بار(باز)+باز(باپ))
2 دلار = (بار(باز)+باز(باپ))
3 دلار = بار (باز) + باز (باپ)
اگر هیچ گروه ضبط متناظری تعریف نشده باشد، یک خطای مرگبار است.
تکرار بیشتر از 50 بار بدون مصرف هیچ رشته ورودی نیز منجر به این خواهد شد
یک خطای مرگبار حداکثر عمق به پرل کامپایل می شود، بنابراین تغییر آن نیاز به a
ساخت سفارشی
موارد زیر نشان می دهد که چگونه استفاده از نمایه سازی منفی می تواند جاسازی بازگشتی را آسان تر کند
الگوهای داخل یک ساختار "qr//" برای استفاده بعدی:
my $parens = qr/(\((?:[^()]++|(?-1))*+\))/;
if (/foo $parens \s+ \+ \+ \s+ نوار $parens/x) {
#اینجا یه کاری بکن...
}
توجه داشته باشید: که این الگو مانند PCRE یا Python مشابه رفتار نمی کند
ساختاری از همان فرم در پرل می توانید به یک گروه بازگشتی، در PCRE، عقب نشینی کنید
و Python بازگشت به گروه به عنوان اتمی در نظر گرفته می شود. همچنین، اصلاح کننده ها حل می شوند
در زمان کامپایل، بنابراین ساختارهایی مانند (?i:(?1)) یا (?:(?i)(?1)) بر چگونگی
الگوی فرعی پردازش خواهد شد.
"(؟&نام)"
بازگشت به یک الگوی فرعی با نام. یکسان با "(?پارنو)" جز اینکه پرانتز به
بازگشت به با نام تعیین می شود. اگر چند پرانتز دارای نام یکسانی باشند، آن را
به سمت چپ عود می کند.
ارجاع به نامی که در جایی از الگو اعلام نشده است خطا است.
توجه: به منظور آسان کردن کار برای برنامه نویسان با تجربه با پایتون
یا موتورهای regex PCRE الگوی "(?P>NAME)" ممکن است به جای "(?&NAME)" استفاده شود.
"(?(شرط)بله-الگو|نه-الگو)"
"(?(شرط)الگوی بله)"
بیان شرطی اگر "شرط" یک مقدار واقعی را به دست آورد، "الگوی بله" را مطابقت می دهد،
در غیر این صورت با "بدون الگو" مطابقت دارد. یک الگوی گمشده همیشه مطابقت دارد.
"(شرط)" باید یکی از موارد زیر باشد: 1) یک عدد صحیح داخل پرانتز (که در صورتی معتبر است که
جفت پرانتز مربوطه مطابقت دارد)؛ 2) نگاهی به آینده / نگاه کردن به عقب / ارزیابی صفر
ادعای عرض؛ 3) یک نام در پرانتز یا گیومه تکی (که معتبر است اگر a
گروه با نام داده شده مطابقت دارد)؛ یا 4) نماد ویژه (R) (در صورت ارزیابی صحیح است
داخل بازگشت یا eval). علاوه بر این، R ممکن است با یک عدد دنبال شود، (که
زمانی درست خواهد بود که هنگام تکرار در داخل گروه مناسب، یا توسط
&NAME، در این صورت تنها زمانی درست خواهد بود که در حین بازگشت در نامگذاری شده ارزیابی شود
گروه.
در اینجا خلاصه ای از محمولات ممکن آمده است:
(1) (2) ...
بررسی می کند که آیا گروه ضبط شماره گذاری شده با چیزی مطابقت دارد یا خیر.
( ) ('نام')
بررسی می کند که آیا گروهی با نام داده شده با چیزی مطابقت دارد یا خیر.
(?=...) (؟!...) (?<=...) (?
بررسی می کند که آیا الگو مطابقت دارد (یا برای انواع '!' مطابقت ندارد).
(?{ کد })
مقدار برگشتی بلوک کد را به عنوان شرط در نظر می گیرد.
(R) بررسی می کند که آیا عبارت در داخل بازگشت ارزیابی شده است.
(R1) (R2) ...
بررسی می کند که آیا عبارت هنگام اجرای مستقیم در داخل مورد ارزیابی شده است یا خیر
n-امین گروه ضبط. این چک معادل regex است
اگر ((تماس گیرنده(0)[3] معادله 'نام فرعی') { ... }
به عبارت دیگر، پشته بازگشتی کامل را بررسی نمی کند.
(R&NAME)
مشابه "(R1)"، این گزاره بررسی می کند که آیا ما در حال اجرای مستقیم در داخل هستیم یا خیر
از سمت چپ ترین گروه با نام مشخص (این همان منطقی است که توسط "(?&NAME) استفاده می شود."
ابهام زدایی). این پشته کامل را بررسی نمی کند، بلکه فقط نام آن را بررسی می کند
درونی ترین بازگشت فعال
(تعريف كردن)
در این حالت، الگوی بله هرگز مستقیماً اجرا نمی شود و هیچ الگوی خیری اجرا نمی شود
مجاز. از نظر روحی شبیه به "(?{0})" اما کارآمدتر است. برای جزئیات به زیر مراجعه کنید.
مثلا:
m{ ( \( )؟
[^()]+
(?(1) \))
}x
با تکه ای از غیر پرانتزها مطابقت دارد که احتمالاً در خود پرانتز گنجانده شده است.
یک شکل خاص گزاره "(DEFINE)" است که هرگز الگوی بله خود را اجرا نمی کند.
به طور مستقیم، و بدون الگو اجازه نمی دهد. این به شخص اجازه می دهد تا زیر الگوهایی را که
فقط توسط مکانیسم بازگشتی اجرا می شود. به این ترتیب، شما می توانید مجموعه ای از
قوانین بیان منظم که می توانند در هر الگوی که شما انتخاب می کنید ترکیب شوند.
توصیه می شود برای این استفاده بلوک DEFINE را در انتهای قسمت قرار دهید
الگو، و اینکه شما زیرالگوهای تعریف شده در آن را نام ببرید.
همچنین، شایان ذکر است که الگوهای تعریف شده به این شکل احتمالاً به این شکل نخواهند بود
کارآمد، زیرا بهینه ساز در مورد مدیریت آنها بسیار هوشمندانه نیست.
نمونه ای از نحوه استفاده از این مورد به شرح زیر است:
/(؟ (?&NAME_PAT))(? (?&ADDRESS_PAT))
(؟(تعريف كردن)
(؟ ....)
(؟ ....)
)/ایکس
توجه داشته باشید که گروه های ضبط مطابق با بازگشت پس از آن قابل دسترسی نیستند
بازگشت بازمی گردد، بنابراین لایه اضافی از گروه های گرفتن ضروری است. بدین ترتیب
$+{NAME_PAT} حتی اگر $+{NAME} تعریف شود، تعریف نمیشود.
در نهایت، به خاطر داشته باشید که الگوهای فرعی ایجاد شده در یک بلوک DEFINE به حساب می آیند
تعداد مطلق و نسبی ضبط، بنابراین:
my @captures = "a" =~ /(.) # اولین عکسبرداری
(؟(تعريف كردن)
(؟ 1 ) # گرفتن دوم
)/ایکس؛
بگو اسکالار @captures;
خروجی 2 خواهد بود نه 1. این امر به ویژه در صورتی مهم است که قصد کامپایل آن را دارید
تعاریف را با عملگر "qr//" و بعداً آنها را در الگوی دیگری درون یابی کنید.
"(?>الگو)"
یک عبارت فرعی "مستقل" که با زیررشته ای که a مطابقت دارد مستقل
"الگو" اگر در موقعیت داده شده لنگر انداخته شود مطابقت دارد و مطابقت دارد هیچ چی دیگر
نسبت به این بستر. این ساختار برای بهینه سازی آنچه که می کند مفید است
در غیر این صورت منطبقات "ابدی" باشد، زیرا به عقب برنمی گردد (به "بازگشت به عقب" مراجعه کنید).
همچنین ممکن است در مکانهایی مفید باشد که «هرچه میتوانید را بگیرید و چیزی ندهید
بازگشت» معنایی مطلوب است.
به عنوان مثال: "^(?>a*)ab" هرگز مطابقت نخواهد داشت، زیرا "(?>a*)" (در ابتدا لنگر انداخته شده است.
از رشته، مانند بالا) مطابقت خواهد داشت تمام کاراکترهای "a" در ابتدای رشته، ترک
هیچ "a" برای "ab" مطابقت ندارد. در مقابل، "a*ab" با "a+b" مطابقت دارد، زیرا
مطابقت زیر گروه "a*" تحت تأثیر گروه زیر "ab" است (نگاه کنید به
"بازگشت"). به ویژه، "a*" در داخل "a*ab" با کاراکترهای کمتری از a مطابقت دارد
مستقل "a*"، زیرا این باعث می شود دم مطابقت داشته باشد.
"(?>الگو)" پس از تطبیق، به طور کلی آن را غیرفعال نمی کند. این است
هنوز امکان عقب نشینی از ساختار وجود دارد، اما نه در آن. بنابراین
"((?>a*)|(?>b*))ar" همچنان با "bar" مطابقت دارد.
با نوشتن «(?=(pattern))\g{-1} میتوان جلوهای مشابه «(?>الگو)» به دست آورد.
این با همان رشته فرعی «a+» مستقل مطابقت دارد و «\g{-1}» زیر میخورد
رشته همسان؛ بنابراین یک ادعای طول صفر را به یک آنالوگ تبدیل می کند
"(؟>...)". (تفاوت این دو سازه در این است که دومی از a استفاده می کند
گرفتن گروه، بنابراین ترتیبی از مراجع برگشتی در بقیه یک منظم تغییر میکند
اصطلاح.)
این الگو را در نظر بگیرید:
m{ \(
(
[^()]+ # x+
|
\( [^()]* \)
)+
\)
}x
که به طور موثر با یک گروه غیر خالی با پرانتزهای تطبیقی در عمق دو سطح مطابقت دارد
و یا کمتر. با این حال، اگر چنین گروهی وجود نداشته باشد، عملاً برای همیشه زمان زیادی طول خواهد کشید
رشته این به این دلیل است که راههای مختلفی برای تقسیم یک رشته طولانی وجود دارد
چندین رشته فرعی این کاری است که "(.+)+" انجام می دهد و "(.+)+" شبیه a است
الگوی فرعی الگوی بالا در نظر بگیرید که چگونه الگوی بالا عدم تطابق را تشخیص می دهد
"(()aaaaaaaaaaaaaaaaaa" در چند ثانیه، اما هر حرف اضافی این مقدار را دو برابر می کند
زمان. این عملکرد نمایی باعث می شود به نظر برسد که برنامه شما هنگ شده است.
با این حال، یک تغییر کوچک در این الگو
m{ \(
(
(?> [^()]+ ) # x+ را به (?> x+ ) تغییر دهید
|
\( [^()]* \)
)+
\)
}x
که از "(?>...)" استفاده می کند دقیقاً با مورد بالا مطابقت دارد (این را خودتان تأیید کنید
یک تمرین مولد خواهد بود)، اما زمانی که روی a استفاده می شود در یک چهارم زمان به پایان می رسد
رشته مشابه با 1000000 "a" آگاه باشید، با این حال، زمانی که این ساختار است
به دنبال آن یک کمیت، در حال حاضر یک پیام هشدار را تحت عنوان "استفاده
هشدارها" پراگما یا -w سوییچ کنید و بگویید "رشته تهی را چندین بار در regex مطابقت می دهد".
در گروه های ساده، مانند الگوی "(?> [^()]+ )، یک اثر قابل مقایسه ممکن است
مانند "[^()]+ (؟! [^()] )" با نگاه منفی به دست می آید. این فقط 4 بار بود
در رشته ای با 1000000 "a" کندتر است.
معنای "هرچه می توانید را بگیرید و چیزی را پس ندهید" در بسیاری از افراد مطلوب است
موقعیت هایی که در نگاه اول یک "()*" ساده مانند راه حل صحیح به نظر می رسد.
فرض کنید ما متن را با نظراتی که با "#" محدود شده اند و سپس تعدادی اختیاری تجزیه می کنیم
فضای خالی (افقی). برخلاف ظاهر آن، "#[ \t]*" is نه درست
عبارت فرعی برای مطابقت با جداکننده نظر، زیرا ممکن است مقداری فضای خالی را "تصرف کند".
اگر بتوان بقیه الگو را با آن روش مطابقت داد. پاسخ صحیح این است
یکی از اینها:
(?>#[ \t]*)
#[ \t]*(؟![ \t])
به عنوان مثال، برای جذب نظرات غیر خالی به $1، باید از یکی از این موارد استفاده کنید:
/ (?> \# [ \t]* ) ( .+ ) /x;
/ \# [ \t]* ( [^ \t] .* ) /x;
اینکه کدام یک را انتخاب می کنید بستگی به این دارد که کدام یک از این عبارات بهتر منعکس کننده موارد فوق است
مشخصات نظرات
در برخی ادبیات این سازه «تطابق اتمی» یا «ملک» نامیده میشود
تطابق".
کمیتکنندههای مالکی معادل قرار دادن آیتمی هستند که روی آن اعمال میشوند
یکی از این سازه ها معادلات زیر اعمال می شود:
فرم براکتینگ فرم کمیت
------------------------------
PAT*+ (?>PAT*)
PAT++ (?>PAT+)
PAT?+ (?>PAT?)
PAT{min,max}+ (?>PAT{min,max})
"(?[ ])"
به "کلاس های کاراکتر پرانتزی توسعه یافته" در perlrecharclass مراجعه کنید.
ویژه عقب نشینی کنترل افعال
این الگوهای خاص عموماً به شکل "(*VERB:ARG)" هستند. مگر خلافش گفته شود
آرگومان ARG اختیاری است. در برخی موارد حرام است.
هر الگوی حاوی یک فعل عقبگرد خاص که به آرگومان اجازه می دهد دارای خاصیت خاص است
رفتاری که هنگام اجرا، $REGERROR و $REGMARK بسته فعلی را تنظیم می کند
متغیرها هنگام انجام این کار قوانین زیر اعمال می شود:
در صورت شکست، متغیر $REGERROR روی مقدار ARG الگوی فعل تنظیم میشود
فعل در شکست مسابقه دخیل بود. اگر قسمت ARG الگو بود
حذف شد، سپس $REGERROR به نام آخرین الگوی "(*MARK:NAME)" تنظیم می شود
اجرا شد، یا اگر هیچ کدام وجود نداشت، به TRUE. همچنین متغیر $REGMARK روی FALSE تنظیم می شود.
در یک مسابقه موفق، متغیر $REGERROR روی FALSE و $REGMARK تنظیم میشود.
متغیر به نام آخرین الگوی "(*MARK:NAME)" اجرا شده تنظیم می شود. را ببینید
توضیح برای فعل "(*MARK:NAME)" در زیر برای جزئیات بیشتر.
توجه: $REGERROR و $REGMARK متغیرهای جادویی مانند $1 و بسیاری دیگر مربوط به regex نیستند.
متغیرها آنها نه محلی برای یک محدوده، و نه فقط خواندنی، بلکه در عوض بسته فرار هستند
متغیرهای مشابه $AUTOLOAD. از "محلی" برای بومی سازی تغییرات آنها در یک مکان خاص استفاده کنید
دامنه در صورت لزوم
اگر یک الگو حاوی یک فعل عقبگرد خاص نیست که اجازه آرگومان را می دهد، پس
$REGERROR و $REGMARK اصلاً لمس نمی شوند.
افعالی که استدلال می گیرند
"(*PRUNE)" "(*PRUNE:NAME)"
این الگوی عرض صفر درخت عقبگرد را در نقطه فعلی هرس می کند
از شکست عقب نشینی کرد. الگوی "A (*PRUNE) B" را در نظر بگیرید، جایی که A و B هستند
الگوهای پیچیده تا زمانی که به فعل "(*PRUNE)" برسد، A ممکن است به حالت قبلی برگردد
لازم برای تطبیق هنگامی که به آن رسید، تطبیق در B ادامه می یابد، که ممکن است نیز
در صورت لزوم عقب نشینی کنید. با این حال، B نباید مطابقت داشته باشد، پس دیگر عقب نشینی نمی کند
انجام خواهد شد، و الگو در شروع فعلی به طور کامل شکست خواهد خورد
موقعیت.
مثال زیر تمام رشته های تطبیق ممکن را در یک الگو می شمارد
(بدون اینکه واقعاً با هیچ یک از آنها مطابقت داشته باشد).
'aaab' =~ /a+b?(?{چاپ "$&\n"; $count++})(*FAIL)/;
چاپ "Count=$count\n";
که تولید می کند:
آآآب
AAA
aa
a
ابا
aa
a
ab
a
تعداد=9
اگر قبل از شمارش مانند زیر یک "(*PRUNE)" اضافه کنیم
'aaab' =~ /a+b?(*PRUNE)(?{چاپ "$&\n"; $count++})(*FAIL)/;
چاپ "Count=$count\n";
ما از بازگشت به عقب جلوگیری می کنیم و تعداد طولانی ترین رشته منطبق را در هر کدام پیدا می کنیم
نقطه شروع منطبق مانند این است:
آآآب
ابا
ab
تعداد=3
هر تعداد ادعای "(*PRUNE)" ممکن است در یک الگو استفاده شود.
همچنین برای سایر روشهای کنترل، «(?> الگو)» و کمیسازهای مالکیتی را ببینید
عقب نشینی در برخی موارد، استفاده از "(*PRUNE)" را می توان با a جایگزین کرد
"(?>الگو)" بدون تفاوت عملکردی. با این حال، از "(*PRUNE)" می توان استفاده کرد
مواردی را که نمی توان تنها با استفاده از یک "(?> الگو)" بیان کرد.
"(*SKIP)" "(*SKIP:NAME)"
این الگوی عرض صفر مشابه "(*PRUNE)" است، با این تفاوت که در صورت شکست نیز آن را نشان می دهد
به این معنی است که هر متنی که مطابق با الگوی "(*SKIP)" مطابقت داشته باشد
اجرا شدن نمی تواند بخشی از هر مطابقت با این الگو این به طور موثر به این معنی است
که موتور regex در صورت شکست به سمت این موقعیت به جلو پرش می کند و سعی می کند
دوباره مطابقت دهید، (با فرض اینکه فضای کافی برای مطابقت وجود دارد).
نام الگوی "(*SKIP:NAME)" اهمیت ویژه ای دارد. اگر یک
هنگام تطبیق با "(*MARK:NAME)" مواجه شد، سپس این موقعیت است که هست
به عنوان "نقطه پرش" استفاده می شود. اگر "(*MARK)" از آن نام مشاهده نشد،
عملگر "(*SKIP)" هیچ تاثیری ندارد. هنگامی که بدون نام استفاده می شود "نقطه پرش" است
جایی که نقطه تطبیق هنگام اجرای الگوی (*SKIP) بود.
موارد زیر را با مثال های موجود در "(*PRUNE)" مقایسه کنید. توجه داشته باشید که رشته دو برابر است
طولانی:
'aaabaaab' =~ /a+b?(*SKIP)(?{چاپ "$&\n"; $count++})(*FAIL)/;
چاپ "Count=$count\n";
خروجی
آآآب
آآآب
تعداد=2
هنگامی که 'aaab' در ابتدای رشته مطابقت پیدا کرد، و "(*SKIP)" اجرا شد،
نقطه شروع بعدی جایی خواهد بود که مکان نما در زمانی که "(*SKIP)" بود قرار داشت
اجرا شده.
"(*MARK:NAME)" "(*:NAME)"
این الگوی عرض صفر را می توان برای علامت گذاری نقطه ای که در یک رشته به آن می رسید استفاده کرد
بخش خاصی از الگو با موفقیت تطبیق داده شده است. ممکن است به این علامت یک علامت داده شود
نام. یک الگوی بعدی "(*SKIP)" سپس در صورت عقب نشینی به آن نقطه به جلو پرش می شود
به شکست هر تعداد الگوی "(*MARK)" و بخش NAME مجاز است
ممکن است تکراری باشد
علاوه بر تعامل با الگوی "(*SKIP)"، می توان از "(*MARK:NAME)" استفاده کرد
برای "برچسب" کردن شاخه الگو، به طوری که پس از تطبیق، برنامه بتواند تعیین کند
کدام شاخه های الگو در مسابقه دخیل بودند.
هنگامی که یک تطابق با موفقیت انجام می شود، متغیر $REGMARK به نام آن تنظیم می شود
اخیراً "(*MARK:NAME)" را که در مسابقه شرکت داشت اجرا کرد.
این می تواند برای تعیین اینکه کدام شاخه از یک الگو بدون استفاده از a مطابقت دارد استفاده می شود
گروه ضبط جداگانه برای هر شاخه، که به نوبه خود می تواند منجر به عملکرد شود
بهبود، زیرا پرل نمی تواند "/(?:(x)|(y)|(z))/" را به همان اندازه کارآمد بهینه کند.
چیزی شبیه "/(?:x(*MARK:x)|y(*MARK:y)|z(*MARK:z))/".
زمانی که یک مسابقه شکست خورده باشد، و مگر اینکه فعل دیگری در شکست آن دخیل باشد
مطابقت دارد و نام خود را برای استفاده ارائه کرده است، متغیر $REGERROR روی تنظیم می شود
نام جدیدترین اجرا شده "(*MARK:NAME)".
برای جزئیات بیشتر به "(*SKIP)" مراجعه کنید.
به عنوان میانبر "(*MARK:NAME)" را می توان "(*:NAME)" نوشت.
"(*THEN)" "(*THEN:NAME)"
این شبیه به عملگر "گروه برش" "::" از Perl 6 است. مانند "(*PRUNE)"،
این فعل همیشه منطبق است، و هنگامی که در مورد شکست به عقب برگردید، باعث ایجاد regex می شود
موتور برای امتحان تناوب بعدی در درونی ترین گروه محصور (گرفتن یا
در غیر این صورت) که دارای تناوب است. دو شاخه از a
"(?(شرط)yes-pattern|no-pattern)" تا آنجا که
"(*سپس)" مربوط می شود.
نام آن برگرفته از مشاهداتی است که این عملیات با
عملگر تناوب ("|") می تواند برای ایجاد چیزی که اساسا یک الگو است استفاده شود.
بر اساس بلوک if/then/else:
( COND (*THEN) FOO | COND2 (*TEN) BAR | COND3 (*THEN) BAZ )
توجه داشته باشید که اگر این عملگر استفاده شود و در داخل یک متناوب نباشد، عمل می کند
دقیقاً مانند عملگر "(*PRUNE)".
/ A (*آبی) B /
مثل این هست که
/ A (*سپس) B /
اما
/ ( A (*سپس) B | C ) /
همان است که نیست
/ ( A (*آبی) B | C ) /
همانطور که پس از مطابقت با A اما شکست در B، فعل "(*THEN)" به عقب برمی گردد و
C را امتحان کنید؛ اما فعل "(*PRUNE)" به سادگی از کار خواهد افتاد.
افعال بدون استدلال
"(*مرتکب شدن)"
این الگوی "تعهد" پرل 6 است. "یا ":::". این یک الگوی با عرض صفر است
شبیه به "(*SKIP)"، با این تفاوت که وقتی به عقب برگردانده می شود در مورد شکست باعث می شود
مطابقت با شکست کامل. هیچ تلاش دیگری برای یافتن یک مطابقت معتبر با پیشبرد
نشانگر شروع دوباره رخ خواهد داد. مثلا،
'aaabaaab' =~ /a+b?(*COMMIT)(?{چاپ "$&\n"; $count++})(*FAIL)/;
چاپ "Count=$count\n";
خروجی
آآآب
تعداد=1
به عبارت دیگر، یک بار "(*COMMIT)" وارد شده است و اگر الگو وارد نشود
مطابق، موتور regex هیچ تطبیق بیشتری را روی بقیه موارد امتحان نخواهد کرد
رشته
"(*شکست)" "(*F)"
این الگو با هیچ چیز مطابقت ندارد و همیشه شکست می خورد. می توان از آن برای فشار دادن موتور استفاده کرد
برای عقب نشینی معادل "(؟!)" است، اما خواندن آن آسان تر است. در واقع «(؟!)» می شود
بهینه سازی داخلی به "(*FAIL)".
احتمالاً فقط زمانی مفید است که با "(?{})" یا "(??{})" ترکیب شود.
"(*تایید کنید)"
این الگو با هیچ چیز مطابقت ندارد و باعث پایان تطبیق موفقیت آمیز در نقطه می شود
که در آن با الگوی "(*ACCEPT)" مواجه شد، صرف نظر از اینکه وجود دارد یا خیر
در واقع بیشتر برای مطابقت در رشته. هنگامی که در داخل یک الگوی تو در تو، مانند
بازگشت، یا در یک الگوی فرعی که به صورت پویا از طریق "(??{})"، فقط ایجاد می شود
درونی ترین الگو بلافاصله به پایان می رسد.
اگر «(*ACCEPT)» در داخل گروههای ضبطکننده باشد، گروهها بهعنوان علامتگذاری میشوند
در نقطه ای به پایان رسید که در آن "(*ACCEPT)" مواجه شد. برای مثال:
'AB' =~ /(A (A|B(*ACCEPT)|C) D)(E)/x;
مطابقت دارد، و $1 خواهد بود "AB" و $2 خواهد بود "B"، $3 تنظیم نخواهد شد. اگر دیگری
شاخه در پرانتز داخلی مطابقت داشت، مانند رشته "ACDE"، سپس the
"D" و "E" نیز باید مطابقت داده شوند.
عقب نشینی
توجه: این بخش یک تقریب انتزاعی از رفتار بیان منظم را ارائه می دهد. برای
یک دیدگاه دقیق تر (و پیچیده تر) از قوانین مربوط به انتخاب یک مسابقه بین
جایگزین های ممکن، به "ترکیب قطعات RE" مراجعه کنید.
یکی از ویژگی های اساسی تطبیق عبارات منظم شامل مفهومی است که نامیده می شود
عقبگرد، که در حال حاضر (در صورت نیاز) توسط همه غیر مالکان معمولی استفاده می شود
کمیتکنندههای عبارت، یعنی «*»، «*؟»، «+»، «+؟»، «{n،m}»، و «{n،m}؟». عقب نشینی
اغلب به صورت داخلی بهینه می شود، اما اصل کلی که در اینجا ذکر شده معتبر است.
برای مطابقت یک عبارت منظم، تمام عبارت منظم باید مطابقت داشته باشد، نه فقط بخشی
از آن بنابراین اگر شروع یک الگوی حاوی یک کمیت به نحوی موفق شود که
باعث از کار افتادن قطعات بعدی در الگو می شود، موتور منطبق پشتیبان می گیرد و دوباره محاسبه می شود
قسمت ابتدایی - به همین دلیل است که به آن عقبگرد می گویند.
در اینجا مثالی از عقب نشینی آورده شده است: فرض کنید می خواهید کلمه زیر "foo" را پیدا کنید.
در رشته "غذا روی میز غذاست.":
$_ = "غذا روی میز غذاست.";
if (/\b(foo)\s+(\w+)/i ) {
چاپ "$2 به دنبال $1.\n"؛
}
هنگامی که مسابقه اجرا می شود، قسمت اول عبارت منظم ("\b(foo)") ممکن است
درست در ابتدای رشته مطابقت دهید و $1 با "Foo" بارگیری می شود. با این حال، به زودی
همانطور که موتور منطبق می بیند که هیچ فضای سفیدی به دنبال "Foo" که داشت وجود ندارد
با 1 دلار ذخیره می شود، متوجه اشتباه خود می شود و یک کاراکتر بعد از جایی که می شود دوباره شروع می کند
مسابقه آزمایشی داشت این بار تا وقوع بعدی ادامه دارد
"فو". عبارت منظم کامل با این زمان مطابقت دارد و شما خروجی مورد انتظار را دریافت می کنید
از "جدول به دنبال foo."
گاهی اوقات تطابق حداقلی می تواند کمک زیادی کند. تصور کنید که می خواهید همه چیز را بین آنها مطابقت دهید
"فو" و "بار". در ابتدا چیزی شبیه این می نویسید:
$_ = "غذا زیر بار در انبار است.";
if ( /foo(.*)bar/ ) {
چاپ "got <$1>\n";
}
که شاید به طور غیرمنتظره ای نتیجه دهد:
بدست آورد
این به این دلیل است که ".*" حریص بود، بنابراین همه چیز بین اول "فو" و آخرین
"بار". در اینجا استفاده از حداقل تطابق برای اطمینان از دریافت متن مؤثرتر است
بین "فو" و اولین "بار" پس از آن.
if ( /foo(.*?)bar/ ) { print "got <$1>\n" }
بدست آورد
در اینجا یک مثال دیگر است. فرض کنید می خواهید یک عدد را در انتهای یک رشته مطابقت دهید و
شما همچنین می خواهید قسمت قبلی مسابقه را حفظ کنید. پس اینو بنویس:
$_ = "من 2 عدد دارم: 53147";
if ( /(.*)(\d*)/ ) { # اشتباه است!
چاپ "شروع <$1>، عدد <$2> است.\n";
}
این به هیچ وجه کار نمی کند، زیرا ".*" حریص بود و کل رشته را بلعید. به عنوان "\d*"
می تواند در یک رشته خالی عبارت منظم کامل که با موفقیت مطابقت داشته باشد مطابقت دهد.
شروع ، عدد <> است.
در اینجا چند نوع وجود دارد که اکثر آنها کار نمی کنند:
$_ = "من 2 عدد دارم: 53147";
@pats = qw{
(.*)(\d*)
(.*)(\d+)
(.*؟)(\d*)
(.*؟)(\d+)
(.*)(\d+)$
(.*؟)(\d+)$
(.*)\b(\d+)$
(.*\D)(\d+)$
};
برای $pat (@pats) {
printf "%-12s", $pat;
اگر (/$pat/ ) {
چاپ "<$1> <$2>\n"؛
} دیگری {
چاپ "FAIL\n"؛
}
}
که چاپ می شود:
(.*)(\d*) <>
(.*)(\d+) <2>
(.*؟)(\d*) <> <>
(.*؟)(\d+) <2>
(.*)(\d+)$ <2>
(.*؟)(\d+)$ <2>
(.*)\b(\d+)$ <2>
(.*\D)(\d+)$ <2>
همانطور که می بینید، این می تواند کمی مشکل باشد. مهم است که بدانیم یک عبارت منظم است
صرفا مجموعه ای از اظهارات است که تعریفی از موفقیت ارائه می دهد. ممکن است 0، 1 یا وجود داشته باشد
چندین روش مختلف که تعریف ممکن است در برابر یک رشته خاص موفق شود. و
اگر چندین راه وجود دارد که ممکن است موفقیت آمیز باشد، برای دانستن باید عقبگرد را درک کنید
به کدام موفقیت خواهید رسید
هنگام استفاده از ادعاها و نفی های آینده نگر، همه اینها می توانند پیچیده تر شوند. تصور کنید
میخواهید دنبالهای از اعداد غیر رقمی را بیابید که "123" دنبال نمیشوند. ممکن است سعی کنید بنویسید
که به عنوان
$_ = "ABC123";
if ( /^\D*(?!123)/ ) { # اشتباه است!
چاپ "بله، نه 123 در $_\n"؛
}
اما این مطابقت ندارد. حداقل، نه آن طور که شما امیدوار هستید. ادعا می کند که وجود دارد
شماره 123 در رشته نیست. در اینجا یک تصویر واضح تر از اینکه چرا آن الگو مطابقت دارد، برعکس است
به انتظارات عمومی:
$x = 'ABC123';
$y = 'ABC445';
چاپ "1: دریافت $1\n" اگر $x =~ /^(ABC)(?!123)/;
چاپ "2: دریافت $1\n" اگر $y =~ /^(ABC)(?!123)/;
چاپ "3: دریافت $1\n" اگر $x =~ /^(\D*)(?!123)/;
چاپ "4: دریافت $1\n" اگر $y =~ /^(\D*)(?!123)/;
این چاپ می کند
2: ABC گرفتم
3: AB گرفتم
4: ABC گرفتم
ممکن است انتظار داشته باشید که تست 3 با شکست مواجه شود زیرا به نظر می رسد نسخه ای با هدف کلی تر باشد
از آزمون 1. تفاوت مهم بین آنها این است که آزمون 3 حاوی یک کمیت است
("\D*") و بنابراین می توانید از عقبگرد استفاده کنید، در حالی که تست 1 این کار را نمی کند. اتفاقی که می افتد این است
شما پرسیده اید "آیا درست است که در شروع $x، پس از 0 یا بیشتر غیر رقمی، شما
چیزی که 123 نیست؟" اگر تطبیق الگو اجازه می داد "\D*" به "ABC" گسترش یابد، این
باعث شکست کل الگو می شد.
موتور جستجو در ابتدا "\D*" را با "ABC" مطابقت می دهد. سپس سعی خواهد کرد مطابقت داشته باشد
«(؟!123)» با «123» که با شکست مواجه می شود. اما از آنجا که یک کمیت ("\D*") در آن استفاده شده است
عبارت منظم، موتور جستجو میتواند مطابقت را بهطور متفاوتی در قسمت عقب برگرداند و دوباره امتحان کند
امیدوارم با عبارت منظم کامل مطابقت داشته باشد.
الگو واقعا، واقعا می خواهد موفق شود، بنابراین از الگوی استاندارد back-off-and- استفاده می کند
دوباره امتحان کنید و اجازه دهید "\D*" این بار فقط به "AB" گسترش یابد. حالا واقعاً چیزی وجود دارد
به دنبال "AB" که "123" نیست. این "C123" است که کافی است.
ما می توانیم با استفاده از یک ادعا و یک نفی با این موضوع مقابله کنیم. ما می گوییم که اول
قسمت $1 باید هم با یک رقم و هم با چیزی که "123" نیست دنبال شود. یاد آوردن
که نگاههای پیش رو عباراتی با عرض صفر هستند - آنها فقط به نظر میرسند، اما هیچ کدام را مصرف نمیکنند.
رشته در مسابقه آنها. بنابراین بازنویسی به این روش آنچه را که انتظار دارید تولید می کند. به این معنا که،
مورد 5 شکست خواهد خورد، اما مورد 6 موفق می شود:
چاپ "5: دریافت $1\n" اگر $x =~ /^(\D*)(?=\d)(?!123)/;
چاپ "6: دریافت $1\n" اگر $y =~ /^(\D*)(?=\d)(?!123)/;
6: ABC گرفتم
به عبارت دیگر، دو ادعای عرض صفر در کنار یکدیگر به گونهای عمل میکنند که انگار هستند
AND با هم، درست همانطور که از هر ادعای داخلی استفاده می کنید: "/^$/" فقط در صورتی مطابقت دارد که شما
در ابتدای خط و انتهای خط به طور همزمان. هر چه عمیق تر
حقیقت اساسی این است که کنار هم قرار گرفتن در عبارات منظم همیشه به معنای AND است، به جز
هنگامی که یک OR صریح با استفاده از نوار عمودی می نویسید. "/ab/" به معنای مطابقت "a" و (سپس)
مطابقت "ب"، اگرچه منطبقات تلاش شده در موقعیت های مختلف ساخته می شوند زیرا "a" است
نه یک ادعای عرض صفر، بلکه یک ادعای یک عرض.
هشدار: حل عبارات منظم به خصوص پیچیده می تواند به زمان تصاعدی نیاز داشته باشد
به دلیل تعداد بیشمار راههای ممکن که میتوانند از عقبگردی برای امتحان کردن استفاده کنند
همخوانی داشتن. به عنوان مثال، بدون بهینه سازی داخلی که توسط موتور بیان منظم انجام شده است،
اجرای این کار زمان دردناکی طولانی خواهد داشت:
'aaaaaaaaaaa' =~ /((a{0,5}){0,5})*[c]/
و اگر از "*" در گروه های داخلی به جای محدود کردن آنها به 0 تا 5 استفاده کرده اید
منطبق می شود، سپس برای همیشه طول می کشد - یا تا زمانی که فضای پشته تمام شود. علاوه بر این، اینها
بهینه سازی داخلی همیشه قابل اجرا نیست. به عنوان مثال، اگر به جای آن "{0,5}" را قرار دهید
از "*" در گروه خارجی، هیچ بهینه سازی فعلی قابل اعمال نیست، و مطابقت به a
زمان طولانی برای اتمام
یک ابزار قدرتمند برای بهینه سازی این گونه جانوران چیزی است که به عنوان "گروه مستقل" شناخته می شود.
که به عقب برنمی گردد (به ""(?>الگو)"" مراجعه کنید. همچنین به طول صفر توجه کنید
ادعاهای نگاه به جلو/نگاه به پشت برای تطبیق دم عقب نشینی نمی کنند، زیرا آنها
در زمینه "منطقی" هستند: فقط اینکه مطابقت داشته باشند مرتبط در نظر گرفته می شود. برای مثال
که در آن عوارض جانبی نگاه به آینده قدرت روی مسابقه زیر تأثیر گذاشته اند، ببینید
""(?>الگو)"".
نسخه 8 منظم عبارات
اگر با روالهای معمولی نسخه 8 regex آشنا نیستید، در اینجا
قوانین تطبیق الگو که در بالا توضیح داده نشده است.
هر شخصیت منفرد با خودش مطابقت دارد، مگر اینکه a باشد فرا شخصیت با معنای خاص
در اینجا یا در بالا توضیح داده شده است. شما می توانید کاراکترهایی را ایجاد کنید که معمولاً به عنوان کاراکتر عمل می کنند
فراکاراکترهایی که باید با پیشوند "\" به معنای واقعی کلمه تفسیر شوند (به عنوان مثال، "\."
منطبق بر یک "."، نه هر کاراکتری. "\\" با "\" مطابقت دارد. این مکانیسم فرار نیز هست
برای کاراکتر مورد استفاده به عنوان جداکننده الگو مورد نیاز است.
یک سری کاراکتر با آن سری از کاراکترها در رشته هدف مطابقت دارد، بنابراین
الگوی "blurfl" با "blurfl" در رشته هدف مطابقت دارد.
شما می توانید یک کلاس کاراکتر را با قرار دادن لیستی از کاراکترها در "[]" مشخص کنید
با هر شخصیت از لیست مطابقت دهید. اگر اولین کاراکتر بعد از "[" "^" باشد، کلاس
با هر شخصیتی که در لیست نیست مطابقت دارد. در یک لیست، کاراکتر "-" a را مشخص می کند
محدوده، به طوری که "az" همه کاراکترهای بین "a" و "z" را شامل می شود. اگر شما
می خواهید خود "-" یا "]" عضو یک کلاس باشد، آن را در ابتدای لیست قرار دهید
(احتمالاً بعد از «^»)، یا با یک اسلش از آن فرار کنید. "-" نیز به معنای واقعی کلمه وقتی گرفته می شود
درست قبل از بسته شدن "]" در انتهای لیست قرار دارد. (موارد زیر همه را مشخص می کنند
همان کلاس از سه کاراکتر: "[-az]، "[az-]، و "[a\-z]". همه متفاوت از
"[az]"، که کلاسی حاوی بیست و شش کاراکتر را مشخص میکند، حتی بر اساس EBCDIC
مجموعه کاراکترها.) همچنین، اگر سعی کنید از کلاس های کاراکتر "\w"، "\W"، "\s"، "\S" استفاده کنید،
"\d" یا "\D" به عنوان نقاط پایانی یک محدوده، "-" به معنای واقعی کلمه درک می شود.
همچنین توجه داشته باشید که ایده کل محدوده بین مجموعه کاراکترها غیر قابل حمل است، به جز
برای چهار موقعیتی که پرل به طور خاص آن ها را مدیریت می کند. هر زیر مجموعه ای از محدوده های "[AZ]"،
"[az]"، و "[0-9]" تضمین میشوند که با زیرمجموعه مورد انتظار نویسههای ASCII مطابقت داشته باشند، خیر
مهم است که پلتفرم چه مجموعه شخصیتی در حال اجرا است. راه چهارم قابل حمل برای تعیین
ranges استفاده از نحو "\N{...}" برای تعیین هر یک از نقاط انتهایی محدوده است. برای
به عنوان مثال، "[\N{U+04}-\N{U+07}]" به معنای مطابقت با نقاط کد یونیکد "\N{U+04}" است،
«\N{U+05}»، «\N{U+06}»، و «\N{U+07}»، هر مقدار که مقادیر اصلی آنها ممکن است در
سکو. در استفاده از re 'strict' یا در ""(?[ ])"، در صورت فعال بودن، هشداری داده می شود.
و نقطه پایانی دیگر یک محدوده که دارای یک "\N{...}" است قابل حمل نیست
مشخص شده. مثلا،
[\N{U+00}-\x06] # اخطار در قسمت «use re 'strict'».
درک اینکه دقیقاً چه چیزی با محدوده هایی غیر از زیرمجموعه ها مطابقت دارد، دشوار است
"[AZ]"، "[az]"، و "[0-9]". یک اصل صحیح این است که فقط از محدوده هایی استفاده کنید که از آن شروع می شوند
و به حروف الفبای حروف مساوی ([ae]، [AE]) یا اعداد ([0-9]) ختم شود. هر چیزی
دیگری ناامن یا نامشخص است. اگر شک دارید، محدوده را به طور کامل بیان کنید.
نویسهها ممکن است با استفاده از نحو متاکاراکتر بسیار شبیه آنچه در C استفاده میشود مشخص شوند: "\n"
منطبق با یک خط جدید، "\t" یک برگه، "\r" یک بازگشت کالسکه، "\f" یک فید فرم، و غیره. بیشتر
بطور کلی، \nnn، که در آن nnn رشته ای از سه رقم هشتی است که با کاراکتری مطابقت دارد
مقدار مجموعه کاراکتر کد شده است nnn. به طور مشابه، \xnn، که در آن nn ارقام هگزادسیمال هستند،
با شخصیتی که ترتیب آن است مطابقت دارد nn. عبارت \cx با شخصیت مطابقت دارد
کنترل-x. در نهایت، "." متاکاراکتر با هر کاراکتری به جز "\n" مطابقت دارد (مگر اینکه شما
از "/s" استفاده کنید).
با استفاده از «|» میتوانید یک سری گزینههای جایگزین برای یک الگو مشخص کنید. برای جدا کردن آنها، به طوری که
"fee|fie|foe" با هر یک از "fee"، "fie" یا "foe" در رشته هدف مطابقت دارد (همانطور که می شود
"f(e|i|o)e"). اولین جایگزین شامل همه چیز از آخرین جداکننده الگو است
("("، "(?:"، و غیره یا ابتدای الگو) تا "|" اول و آخرین
جایگزین شامل همه چیز از آخرین "|" است. به جداکننده الگوی بسته شدن بعدی.
به همین دلیل استفاده از جایگزین ها در پرانتز معمول است: به حداقل رساندن
سردرگمی در مورد شروع و پایان آنها.
جایگزین ها از چپ به راست امتحان می شوند، بنابراین اولین جایگزین پیدا شد که برای آن
کل عبارت منطبق است، همانی است که انتخاب شده است. این بدان معنی است که جایگزین ها وجود ندارند
لزوما حریص به عنوان مثال: هنگام تطبیق "foo|foot" در برابر "پابرهنه"، فقط
بخش "foo" مطابقت دارد، زیرا اولین جایگزینی است که امتحان شده است و با موفقیت مطابقت دارد
رشته هدف (این ممکن است مهم به نظر نرسد، اما زمانی که شما هستید مهم است
گرفتن متن مطابق با استفاده از پرانتز.)
همچنین به یاد داشته باشید که "|" به صورت تحت اللفظی در داخل کروشه تفسیر می شود، بنابراین اگر بنویسید
"[fee|fie|foe]" شما واقعاً فقط با "[feio|] مطابقت دارید".
در یک الگو، میتوانید با احاطه کردن آنها، الگوهای فرعی را برای ارجاع بعدی تعیین کنید
پرانتز، و شما ممکن است به مراجعه کنید nزیر الگوی بعدی در الگو با استفاده از
فرا شخصیت \n یا \gn. الگوهای فرعی بر اساس ترتیب از چپ به راست شماره گذاری می شوند
پرانتز آغازین آنها یک مرجع برگشتی با هر چیزی که واقعاً مطابقت دارد مطابقت دارد
الگوی فرعی در رشته مورد بررسی، نه قوانین آن زیرالگو. از این رو،
"(0|0x)\d*\s\g1\d*" با "0x1234 0x4321" مطابقت دارد، اما نه با "0x1234 01234"، زیرا الگوی فرعی
1 با "0x" مطابقت دارد، حتی اگر قانون "0|0x" به طور بالقوه می تواند با 0 پیشرو در
شماره دوم
هشدار on \1 بجای of $1
برخی از افراد بیش از حد به نوشتن چیزهایی مانند:
$pattern =~ s/(\W)/\\\1/g;
این برای RHS یک جایگزین برای جلوگیری از شوک زدن (از 1 تا 9) است. SED
معتادان، اما این یک عادت کثیف است. دلیلش این است که در PerlThink، دست راست است
سمت یک "s///" یک رشته دو نقل قول است. "\1" در رشته معمولی دو نقل قول به معنای است
یک کنترل-A. معنای رایج یونیکس "\1" به معنای "s///" است. با این حال، اگر
شما عادت به انجام این کار را پیدا می کنید، اگر یک مورد را اضافه کنید، خود را دچار مشکل می کنید
اصلاح کننده "/e".
s/(\d+)/ \1 + 1 /eg; # باعث هشدار زیر -w می شود
یا اگر سعی کنید انجام دهید
s/(\d+)/\1000/;
شما نمیتوانید با گفتن «\{1}000» ابهامزدایی کنید، در حالی که میتوانید با «{1}000 دلار» آن را برطرف کنید.
عملیات درون یابی را نباید با عملیات تطبیق a اشتباه گرفت
ارجاع به عقب مطمئناً آنها به معنای دو چیز متفاوت هستند ترک کرد سمت "s///".
تکرار الگوهای تطابق a طول صفر زیر رشته
هشدار: مطالب سخت (و نثر) در پیش است. این بخش نیاز به بازنویسی دارد.
عبارات منظم یک زبان برنامه نویسی مختصر و قدرتمند را ارائه می دهند. مانند بسیاری دیگر
ابزارهای برقی، قدرت همراه با توانایی ویران کردن است.
سوء استفاده رایج از این قدرت ناشی از توانایی ایجاد حلقه های بی نهایت با استفاده از منظم است
عبارات، با چیزی به عنوان بی ضرر مانند:
'foo' =~ m{ ( o? )* }x;
"o؟" در ابتدای "foo" منطبق است، و از آنجایی که موقعیت در رشته نیست
با بازی حرکت کرد، "o?" بارها و بارها به دلیل کمیت "*" مطابقت خواهد داشت.
یکی دیگر از راه های متداول برای ایجاد یک چرخه مشابه، با مدیفایر حلقه "//g" است:
@matches = ( 'foo' =~ m{ o? }xg );
or
چاپ "match: <$&>\n" در حالی که "foo" =~ m{ o؟ }xg;
یا حلقه ای که توسط شکاف().
با این حال، تجربه طولانی نشان داده است که بسیاری از وظایف برنامه نویسی ممکن است قابل توجه باشد
با استفاده از عبارات فرعی مکرر که ممکن است با زیررشتههای با طول صفر مطابقت داشته باشند، ساده شده است. اینجاست
یک مثال ساده:
@chars = split //, $string; # // در تقسیم جادو نیست
($whitewashed = $string) =~ s/()/ /g; # والدین از جادو اجتناب می کنند // /
بنابراین پرل چنین سازه هایی را توسط به زور شکستن la نا محدود حلقه. قوانین برای
این برای حلقههای سطح پایینتر دادهشده توسط کمیسازهای حریصانه "*+{}" و برای
سطوح بالاتر مانند اصلاح کننده "/g" یا شکاف() اپراتور.
حلقه های سطح پایین تر هستند منقطع (یعنی حلقه شکسته است) وقتی پرل آن را تشخیص داد
یک عبارت تکرار شده با یک زیر رشته با طول صفر مطابقت دارد. بدین ترتیب
m{ (?: NON_ZERO_LENGTH | ZERO_LENGTH )* }x;
معادل ساخته شده است
m{ (?: NON_ZERO_LENGTH )* (?: ZERO_LENGTH )؟ }ایکس؛
مثلا این برنامه
#!perl -l
"آآآآب" =~ /
(?:
یک # غیر صفر
| # یا
(?{print "hello"}) # print hello anywhere this
# شعبه امتحان شده است
(?=(ب)) # ادعای عرض صفر
)* # هر تعداد بار
/ایکس؛
چاپ $&;
چاپ 1 دلار؛
چاپ
سلام
AAAAA
b
توجه داشته باشید که "سلام" فقط یک بار چاپ می شود، مانند زمانی که پرل می بیند که تکرار ششم از
بیرونی ترین "(?:)*" با یک رشته با طول صفر مطابقت دارد، "*" را متوقف می کند.
حلقه های سطح بالاتر یک حالت اضافی بین تکرارها حفظ می کنند: آیا آخرین
مسابقه صفر طول داشت برای شکستن حلقه، مسابقه زیر پس از یک مسابقه صفر طول انجام می شود
داشتن طول صفر ممنوع است. این ممنوعیت با عقب نشینی در تعامل است (نگاه کنید به
"بازگشت")، و به همین ترتیب دوم بهترین مطابقت انتخاب شده است اگر بهترین مطابقت صفر است
طول
مثلا:
$_ = 'نوار';
s/\w??/<$&>/g;
منجر به "<> <> <> می شود <>". در هر موقعیت از رشته بهترین تطابق داده شده توسط
غیر حریص "??" مطابقت با طول صفر است و دوم بهترین مطابقت چیزی است که با آن مطابقت دارد
"\w". بنابراین مسابقات با طول صفر با مسابقات یک کاراکتری متناوب می شوند.
به طور مشابه، برای تکرار "m/()/g" دومین مسابقه برتر، مسابقه در موقعیت یک است.
بریدگی بیشتر در رشته
حالت اضافی بودن تطبیق با طول صفر با همسان مرتبط است
رشته، و با هر انتساب به بازنشانی می شود pos(). مسابقات صفر طول در پایان
بازی قبلی در حین "شکاف" نادیده گرفته می شوند.
ترکیب RE قطعات
هر یک از قطعات ابتدایی عبارات منظم که قبلا توضیح داده شد (مانند
"ab" یا "\Z") می تواند حداکثر با یک زیر رشته در موقعیت داده شده رشته ورودی مطابقت داشته باشد.
با این حال، در یک عبارت منظم معمولی، این قطعات ابتدایی در موارد بیشتری ترکیب میشوند
الگوهای پیچیده با استفاده از ترکیب عملگرهای "ST"، "S|T"، "S*" و غیره (در این مثال ها
"S" و "T" عبارتهای فرعی معمولی هستند).
چنین ترکیباتی می تواند شامل جایگزین هایی باشد که منجر به مشکل انتخاب می شود: اگر a را مطابقت دهیم
عبارت منظم "a|ab" در برابر "abc"، آیا با زیر رشته "a" یا "ab" مطابقت دارد؟ یک راه برای
توضیح اینکه کدام زیررشته واقعاً مطابقت دارد مفهوم عقبگرد است (نگاه کنید به
"بازگشت"). با این حال، این توصیف بیش از حد سطح پایین است و شما را وادار می کند تا در حد فکر کنید
از یک پیاده سازی خاص
توصیف دیگری با مفاهیم "بهتر"/"بدتر" شروع می شود. تمام رشته های فرعی که ممکن است
مطابق با عبارت منظم داده شده را می توان از "بهترین" مطابق به مرتب کرد
"بدترین" مسابقه، و این "بهترین" مسابقه است که انتخاب می شود. این جایگزین سوال می شود
از "چه چیزی انتخاب شده است؟" با این سوال که "کدام مسابقه بهتر است و کدام بدتر؟".
باز هم، برای قطعات ابتدایی چنین سوالی وجود ندارد، زیرا حداکثر یک مسابقه در یک زمان معین
موقعیت ممکن است. این بخش مفهوم بهتر/بدتر را برای ترکیب توضیح می دهد
اپراتورها در توضیحات زیر "S" و "T" عبارتهای فرعی منظم هستند.
"ST"
دو تطابق ممکن را در نظر بگیرید، "AB" و "A'B"، "A" و "A" رشته های فرعی هستند که می توانند
با "S"، "B" و "B" تطبیق داده شوند، زیر رشته هایی هستند که می توانند با "T" تطبیق داده شوند.
اگر "الف" برای "س" بهتر از "الف" باشد، "AB" تطبیق بهتری از "A'B" است.
اگر "الف" و "الف" منطبق باشند: "AB" تطبیق بهتری از "AB" است اگر "B" تطبیق بهتری داشته باشد.
برای "T" از "B".
"S|T"
وقتی "S" می تواند مطابقت داشته باشد، تطبیق بهتری نسبت به زمانی است که فقط "T" می تواند مطابقت داشته باشد.
ترتیب دو مسابقه برای "S" مانند "S" است. مشابه برای دو مسابقه برای
"T".
"S{REPEAT_COUNT}"
مطابق با "SSS...S" (به تعداد دفعات لازم تکرار می شود).
"S{min، max}"
مطابق با "S{max}|S{max-1}|...|S{min+1}|S{min}".
"S{min، max}؟"
مطابق با "S{min}|S{min+1}|...|S{max-1}|S{max}".
"S?"، "S*"، "S+"
به ترتیب مانند «S{0,1،0}»، «S{1،BIG_NUMBER}»، «S{XNUMX,BIG_NUMBER}».
"S??"، "S*?"، "S+?"
مانند «S{0,1،0}؟»، «S{1،BIG_NUMBER}؟»، «S{XNUMX،BIG_NUMBER}؟» به ترتیب.
"(?>S)"
بهترین بازی را برای "S" و فقط آن منطبق می کند.
"(?=S)"، "(?<=S)"
فقط بهترین تطابق برای "S" در نظر گرفته می شود. (این فقط در صورتی مهم است که "S" داشته باشد
گرفتن پرانتز و ارجاع به عقب در جای دیگری در کل معمولی استفاده می شود
اصطلاح.)
"(?!S)"، "(?
برای این اپراتور گروه بندی نیازی به توصیف سفارش نیست، زیرا فقط
اینکه "S" می تواند مطابقت داشته باشد یا نه مهم است.
"(??{ EXPR })", "(?پارنو)"
ترتیب مانند عبارت منظم است که نتیجه EXPR یا است
الگوی موجود توسط گروه ضبط PARNO.
"(?(شرط)بله-الگو|نه-الگو)"
به یاد بیاورید که کدام یک از «الگوی بله» یا «الگوی خیر» در واقع مطابقت دارد
مشخص. ترتیب مسابقات مانند عبارت فرعی انتخاب شده است.
دستور العمل های بالا ترتیب کبریت ها را شرح می دهند at a داده موقعیت. یک قانون دیگر این است
برای درک اینکه چگونه یک مطابقت برای کل عبارت منظم تعیین می شود: یک تطابق لازم است
در یک موقعیت زودتر همیشه بهتر از مسابقه در موقعیت دیرتر است.
ایجاد سفارشی RE موتورهای حرفه ای
از نسخه 5.10.0 پرل، می توان موتورهای بیان منظم سفارشی ایجاد کرد. این برای
ضعف قلب، زیرا آنها باید در سطح C وصل شوند. برای جزئیات بیشتر به perlreapi مراجعه کنید.
به عنوان یک جایگزین، ثابت های اضافه بار (به اضافه بار مراجعه کنید) یک راه ساده برای گسترش آن ارائه می دهند
عملکرد موتور RE، با جایگزینی یک الگو با الگوی دیگر.
فرض کنید که می خواهیم یک دنباله فرار RE جدید "\Y|" را فعال کنیم. که در یک مرز مطابقت دارد
بین کاراکترهای فضای خالی و کاراکترهای بدون فاصله. توجه داشته باشید که
"(?=\S)(?
"\Y|" در جای نسخه پیچیده تر. ما می توانیم یک ماژول "customre" برای ایجاد کنیم
این کار را انجام دهید:
بسته سفارشی;
استفاده از اضافه بار؛
واردات فرعی {
تغییر مکان؛
اگر @_;
overload::constant 'qr' => \&convert;
}
sub invalid { die "/$_[0]/: invalid escape '\\$_[1]'"}
# همچنین باید مراقب باشیم که از شر مشروع \\Y| فرار نکنیم
دنباله #، از این رو وجود '\' در قوانین تبدیل.
my %rules = ( '\\' => '\\\\',
'Y|' => qr/(?=\S)(?
تبدیل فرعی {
من $re = shift;
$re =~ s{
\\ ( \\ | Y. )
}
{ $rules{$1} or invalid($re,$1) }sgex;
بازگشت $re;
}
اکنون "use customre" فرار جدید را در عبارات منظم ثابت، به عنوان مثال، فعال می کند
بدون هیچ گونه درون یابی متغیر زمان اجرا. همانطور که در اضافه بار مستند شده است، این تبدیل
فقط روی قسمت های تحت اللفظی عبارات منظم کار خواهد کرد. برای "\Y|$re\Y|" متغیر
بخشی از این عبارت منظم باید به صراحت تبدیل شود (اما فقط در صورتی که خاص باشد
معنی "\Y|" باید در داخل $re فعال شود):
استفاده از customre;
$re = <>;
chomp $re;
$re = customre::convert $re;
/\Y|$re\Y|/;
جاسازی شده رمز اعدام فرکانس
قوانین دقیق برای تعداد دفعات اجرای (??{}) و (?{}) در یک الگو مشخص نشده است.
در صورت یک مسابقه موفقیت آمیز، می توانید فرض کنید که آنها DWIM و در اجرا خواهند شد
از چپ به راست تعداد دفعات مناسب را در مسیر پذیرش الگو ترتیب دهید
مانند هر متاالگوی دیگری. چگونه مسیرهای عدم پذیرش و شکست های مسابقه بر روی آن تأثیر می گذارد
تعداد دفعاتی که یک الگو اجرا می شود به طور خاص مشخص نیست و ممکن است بسته به آن متفاوت باشد
در مورد اینکه چه بهینه سازی هایی را می توان روی الگو اعمال کرد و احتمالاً از نسخه تغییر می کند
به نسخه.
به عنوان مثال در
"aaabcdeeeee" =~/a(?{print "a"})b(?{print "b"})cde/;
تعداد دقیق دفعاتی که "a" یا "b" چاپ می شوند برای خرابی مشخص نشده است، اما شما
ممکن است فرض کند که آنها حداقل یک بار در طول یک مسابقه موفق چاپ خواهند شد، علاوه بر این شما
ممکن است فرض کند که اگر "b" چاپ شده باشد، حداقل یک "الف" قبل از آن خواهد بود.
در مورد ساختارهای انشعاب مانند زیر:
/a(b|(?{ print "a" }))c(?{ print "c" })/;
شما می توانید فرض کنید که ورودی "ac" خروجی "ac" و "abc" تنها خروجی "c" خواهد داشت.
وقتی کد تعبیه شده کمیت شود، منطبق های موفق کد را یک بار برای هر کدام فراخوانی می کنند
تکرار منطبق از کمیت. مثلا:
"خوب" =~ /g(?:o(?{چاپ "o"}))*d/;
دوبار "o" را خروجی می دهد.
PCRE/Python پشتیبــانی
از Perl 5.10.0، Perl از چندین افزونه اختصاصی Python/PCRE برای regex پشتیبانی می کند.
نحو. در حالی که برنامه نویسان Perl تشویق به استفاده از نحو خاص Perl هستند،
موارد زیر نیز پذیرفته می شود:
"(؟پ الگو)"
یک گروه ضبط با نام تعریف کنید. معادل "(? الگو)".
"(?P=NAME)"
ارجاع مجدد به یک گروه ضبط با نام. معادل "\g{NAME}".
"(?P>NAME)"
فراخوانی زیر روال به یک گروه ضبط نامگذاری شده. معادل "(?&NAME)".
با استفاده از خدمات onworks.net از perlre آنلاین استفاده کنید