متلازمة عود الأسنان المائل
في برمجة الحاسوب ، تُعرف متلازمة عود الأسنان المائل ( LTS ) بأنها حالة يصبح فيها التعبير المقتبس مُربكًا بصريًا لاحتوائه على عدد كبير من أحرف الهروب لتجنب تضارب المحددات (أي لتجنب التفسيرات الغامضة وغير الحتمية في البرنامج). [ 1 ] [ 2 ] عادةً ما تكون أحرف الهروب هي الشرطات المائلة العكسية ( \\)، ولكن يمكن أن تكون أنواعًا أخرى من الأحرف أيضًا. مثال على متلازمة عود الأسنان المائل هو /^\\\/\\+\/\\?\/\\$/.
تُسمى متلازمة عود الأسنان المائل بهذا الاسم بسبب المظهر المرئي لكل شرطة مائلة عكسية (أو شرطة مائلة أمامية، وهي حرف هروب شائع آخر) تشبه عود أسنان مائل ، بالإضافة إلى السلاسل التي تعاني من متلازمة عود الأسنان المائل والتي تحتوي على عدد كبير من الشرطات المائلة.
يظهر نمط LTS في العديد من لغات البرمجة وفي العديد من المواقف، بما في ذلك الأنماط التي تتطابق مع مُعرّفات الموارد الموحدة (URIs)، والبرامج التي تتعامل مع الملفات ومحتوياتها، والبرامج التي تُخرج نصًا مُقتبسًا (أي نص يحتوي على علامات اقتباس، أو مُحاط بعلامات اقتباس، أو كليهما). تندرج العديد من أنماط quines ضمن الفئة الأخيرة.
أدخلت وثائق بيرل الرسمية [ 3 ] المصطلح إلى نطاق أوسع؛ حيث يُستخدم لوصف التعابير النمطية التي تُطابق مسارات يونكس ، حيث تُفصل العناصر بشرطات مائلة /. تُستخدم الشرطة المائلة أيضًا كفاصل افتراضي للتعابير النمطية؛ لذا، لاستخدامها حرفيًا في التعبير، يجب وضع شرطة مائلة عكسية قبلها\ ، مما يؤدي إلى ظهور شرطات مائلة عكسية متكررة \/. إذا تكررت، كما في عناوين URL، ينتج \/\/عنها شرطة مائلة عكسية //.
تحدث ظاهرة مشابهة في مسارات MS-DOS و Windows ، حيث يُستخدم الخط المائل العكسي كفاصل للمسارات، كما في المثال `<script>`، بدلاً من استخدام الخط المائل الأمامي كما في أنظمة Unix . ونتيجةً لاستخدام الخط المائل العكسي بدلاً من الخط المائل الأمامي، يتطلب Windows عادةً أحرف هروب إضافية مقارنةً بمسارات Unix. لذا، من المرجح أن تُسبب مسارات Windows إحباطًا للمبرمجين.C:\Users\Amy\Desktop\Q1-report.pdf/home/Amy/Desktop/Q1-report.pdf\/
مسارات نظام التشغيل ويندوز، وتخزين السلاسل النصية، والتعبيرات النمطية
عند إجراء أي عمليات على الملفات تتطلب تخزين مسارات بنمط ويندوز (بدلاً من استخدامها مباشرةً)، تتطلب هذه العمليات وجود شرطة مائلة عكسية مزدوجة \\لكل شرطة مائلة عكسية أصلية، مما يُنشئ مسارًا قابلاً للتخزين C:\\Users\\Amy\\Desktop\\Q1-report.pdf. يمكن بعد ذلك إعادة تهريب سلسلة المسار لاستخدامها داخل تعبير نمطي (لا يزال داخل سلسلة مهربة)، مما يتطلب مطابقة شرطة مائلة عكسية واحدة في النص الأصلي.\\\\
- من ناحية التحليل، يكون ترتيب التحويلات/"الهروب" هو
({\\}{\\}).- يتم استخدام الجزأين الداخليين،
{\\}و{\\}، لمجرد تخزين السلسلة داخل البرنامج. - بعد التخزين، يتم استخدام الجزء الخارجي،
(...)، والذي أصبح الآن مكافئًا\\للسلسلة بأكملها، للتعبير النمطي حيث\\يتم تفسير الناتج على أنه\(special regex matching operator to be used with ambiguous symbols) \(single symbol to be matched)بدلاً من\(single symbol to be matched) \(single symbol to be matched).
- يتم استخدام الجزأين الداخليين،
- لاحظ أن {},[],() في مخططات التحليل هذه تهدف إلى الإشارة إلى مجموعات قابلة للقراءة البشرية ، وليس أي مجموعات regex محجوزة مثل فئات التكافؤ والذرات
\( \)الخاصة بالاستدعاءات.
مثال نموذجي
ضع في اعتبارك التعبير النمطي التالي في لغة بيرل والذي يهدف إلى مطابقة عناوين URI التي تحدد الملفات الموجودة ضمن pubدليل موقع FTP :
m / ftp:\/\/[^\/]*\/pub\/ /تُحلّ لغة بيرل، كما فعلت لغة sed من قبلها، هذه المشكلة بالسماح باستخدام العديد من الأحرف الأخرى كفواصل للتعبير النمطي. على سبيل المثال، الأمثلة الثلاثة التالية تُكافئ التعبير المذكور أعلاه:
m{ftp://[^/]*/pub/} m#ftp://[^/]*/pub/# m!ftp://[^/]*/pub/! أو هذه الترجمة الشائعة لتحويل الشرطات المائلة العكسية إلى شرطات مائلة أمامية:
tr /\\/ \ //قد يكون فهمها أسهل عند كتابتها على هذا النحو:
tr { \\ }{ / }نص مع علامات اقتباس - مثال بلغة بيرل وبي إتش بي
قد يبدو برنامج Perl لطباعة وسم رابط HTML ، حيث يتم تخزين عنوان URL ونص الرابط في متغيرين $urlعلى $textالتوالي، كما يلي. لاحظ استخدام الشرطات المائلة العكسية لتجنب علامات الاقتباس المزدوجة:
اطبع "<a href=\"$url\">$text</a>" ;لا يُمكن استخدام علامات الاقتباس المفردة لتحديد السلسلة النصية، لأن لغة بيرل لا تُوسّع المتغيرات داخل السلاسل النصية المُحاطة بعلامات اقتباس مفردة. على سبيل المثال، لن يعمل الكود أدناه كما هو مُتوقع:
اطبع '<a href="$url">$text</a>'يُعد استخدام هذه printfالدالة حلاً قابلاً للتطبيق في العديد من اللغات (بيرل، بي إتش بي ):
printf ( '<a href="%s">%s</a>' , $url , $text );qqيسمح عامل التشغيل في لغة بيرل باستخدام أي فاصل :
print qq{<a href="$url">$text</a>} ; print qq|<a href="$url">$text</a>| ; print qq(<a href="$url">$text</a>) ;تُعدّ مستندات here مناسبة بشكل خاص للسلاسل النصية متعددة الأسطر؛ ومع ذلك، لم تكن مستندات perl here تسمح بالمسافة البادئة المناسبة قبل الإصدار 5.26. [ 4 ] يوضح هذا المثال صيغة Perl:
اطبع << هنا_ينتهي ; <a href="$url">$text</a> هنا_ينتهيلغات أخرى
سي شارب
تتعامل لغة البرمجة C# مع دعم الإصدارات طويلة الأمد (LTS) باستخدام الرمز @في بداية السلاسل النصية، قبل علامات الاقتباس الأولية، على سبيل المثال
string filePath = @"C:\Foo\Bar.txt" ;بدلاً من اشتراط خلاف ذلك:
string filePath = "C:\\Foo\\Bar.txt" ;لغة سي++
يضيف معيار C ++11 السلاسل الخام :
std :: string filePath = R " ( C:\Foo\Bar.txt ) " ;إذا احتوت السلسلة على الأحرف )"، فيمكن استخدام فاصل اختياري، كما dفي المثال التالي:
std :: regex re { R " d( s/"\([^"]*\)"/'\1'/g )d " };يذهب
يشير Go إلى أن السلسلة خام باستخدام علامة الاقتباس الخلفية كفاصل:
s := `C:\Foo\Bar.txt`قد تحتوي السلاسل النصية الخام على أي حرف باستثناء علامات التنصيص المائلة (``)؛ ولا يوجد رمز هروب لعلامة التنصيص المائلة في سلسلة نصية خام. كما قد تمتد السلاسل النصية الخام على عدة أسطر، كما في هذا المثال، حيث تكون السلسلتان النصيتان ``` sو``` tمتطابقتين:
s := `سلسلة نصية تمتد على عدة أسطر.` t := "سلسلة نصية\nتمتد على عدة\nأسطر."بايثون
يستخدم بايثون بنية مشابهة باستخدام r:
filePath = r "C:\Foo\Bar.txt"يمكن أيضاً استخدامها مع علامات اقتباس ثلاثية:
مثال = r """السطر الأول: "C:\Foo\Bar.txt" السطر الثاني: لا شيء"""R
يحتوي R على بنية مماثلة باستخدام rأو Rمع محددات الأقواس المختلفة ( (, [, {):
filePath <- r "(C:\Foo\Bar.txt)"بالنسبة للسلاسل النصية الخام التي تحتوي على (حالات
string <- r "{نص مع (بعض) الأقواس}"لمزيد من المرونة، يمكن وضع عدد من الشرطات بين علامة الاقتباس الافتتاحية والفاصل الافتتاحي، طالما أن نفس عدد الشرطات يظهر بين الفاصل الختامي وعلامة الاقتباس الختامية.
روبي
تستخدم لغة روبي علامات الاقتباس المفردة للإشارة إلى السلسلة النصية الخام:
filePath = 'C:\Foo\Bar.txt'كما أنها تحتوي على قيم النسبة المئوية باستخدام التعبيرات النمطية مع إمكانية اختيار الفاصل، مثل لغة بيرل:
% r {ftp://[^/]*/pub/} % r #ftp://[^/]*/pub/# % r !ftp://[^/]*/pub/!الصدأ
يستخدم Rust صيغة مختلفة من rالبادئة: [ 5 ]
" \x52 " ; // R r"\x52" ; // \x52 r#""foo""# ; // "foo" r##"foo #"# bar"## ; // foo #"# barيبدأ النص الحرفي بـ rمتبوعًا بأي عدد من #، متبوعًا بـ واحد ". "تُعتبر العناصر الأخرى الموجودة في النص الحرفي جزءًا منه، ما لم يتبعها عدد من العناصر يساوي على الأقل عدد #العناصر المستخدمة بعد r. وبالتالي، r#"لا يمكن أن يحتوي النص الحرفي الذي يبدأ بـ على "#في محتواه.
سكالا
تسمح لغة سكالا باستخدام علامات الاقتباس الثلاثية لتجنب حدوث لبس:
val filePath = """C:\Foo\Bar.txt""" val pubPattern = """ftp://[^/]*/pub/""" rتسمح علامات الاقتباس الثلاثية أيضًا بسلاسل نصية متعددة الأسطر، كما هو موضح هنا:
val text = """السطر الأول، السطر الثاني."""سيد
تتشابه التعابير النمطية في Sed ، وخاصةً تلك التي تستخدم المعامل "s"، إلى حد كبير مع لغة Perl (حيث أن Sed هي لغة سابقة لـ Perl). الفاصل الافتراضي هو "/"، ولكن يمكن استخدام أي فاصل؛ الفاصل الافتراضي هو ، ولكن الفاصل الصحيح هو أيضًا . على سبيل المثال، لمطابقة مجلد "pub" (كما في مثال Perl) واستبداله بـ "foo"، يكون الفاصل الافتراضي (مع تجاهل الشرطات المائلة) هوs/regexp/replacement/s:regexp:replacement:
s / ftp:\/\/[^\/]*\/pub\/ / foo /يؤدي استخدام علامة التعجب ("!") كفاصل بدلاً من ذلك إلى
s ! ftp://[^/]*/pub/ ! foo !انظر أيضاً
مراجع
- ↑ آندي ليستر، ريتشارد فولي (2005). تصحيح أخطاء بيرل الاحترافي . آندي ليستر، ريتشارد فولي. ص 176. ISBN 1-59059-454-1.
- ↑ دانيال غولدمان (فبراير 2013). الدليل الشامل لـ sed . دار نشر EHDP. رقم ISBN 978-1-939824-00-4.
- ↑ بيرلوب في perldoc.perl.org.
- ↑ مستندات مُزاحة هنا
- ↑ سلاسل البايت الخام على rust-lang.org.
- حكايات شعبية في هندسة البرمجيات
- بيرل
- PHP
- التعبيرات النمطية
