سؤال

لقد تم في محاولة لمعرفة regex أن تسمح لي أن البحث عن سلسلة معينة في حين تلقائيا تخطي التعليقات.أي شخص يكون إعادة مثل هذا أو تعرف واحد ؟ حتى أنها لا تحتاج إلى أن تكون متطورة بما فيه الكفاية لتخطي #if 0 كتل ؛ أريد فقط أن تخطي // و /* كتل.العكس, هذا هو فقط البحث داخل التعليق كتل ، سيكون من المفيد جدا أيضا.

البيئة:مقابل 2003

هل كانت مفيدة؟

المحلول

هذا هو أصعب مشكلة مما قد يبدو للوهلة الأولى, منذ كنت بحاجة إلى النظر في التعليق الرموز داخل سلاسل, تعليق الرموز التي هي في حد ذاتها علق بها.... الخ

كتبت سلسلة و تعليق محلل على C#, اسمحوا لي أن نرى ما اذا كان يمكنني انتشال شيء من شأنها أن تساعد...أنا تحديث إذا كنت تجد أي شيء.

تحرير:...حسنا, لقد وجدت القديمة 'codemasker' المشروع.تبين أن فعلت هذا في مراحل وليس مع واحد regex.أساسا أنا بوصة من خلال الملف المصدر تبحث عن بدء الرموز, عندما تجد واحد ثم ابحث عن نهاية رمزية وقناع بين في كل شيء.وهذا يأخذ في الاعتبار السياق من بداية رمزية...إذا يمكنك العثور على رمز "سلسلة ابدأ" ثم يمكنك بشكل آمن تجاهل التعليق الرموز حتى تجد نهاية السلسلة ، والعكس بالعكس.مرة واحدة رمز ملثمين (أنا استخدم guid كما أقنعة ، hashtable لتتبع) ثم يمكنك القيام بأمان البحث واستبدال ، ثم أخيرا استعادة ملثمين رمز.

على أمل أن يساعد.

نصائح أخرى

كن حذرا خاصة مع السلاسل.سلاسل غالبا ما يكون تسلسلات الهروب التي عليك أيضا أن تحترم بينما كنت تجد نهاية لها.

لذلك على سبيل المثال "This is \"a test\"".عمياء لا ابحث عن انقر نقرا مزدوجا اقتباس إنهاء.حذار أيضا من `"هذا هو \"`, والذي يظهر أنه لا يمكنك فقط أن أقول "ما لم مزدوجة-اقتباس يسبقه مائل."

في ملخص, جعل بعض وحشية وحدة الاختبارات!

أ regexp ليست أفضل وسيلة للحصول على الوظيفة.

بيرل التعليمات:

ج التعليقات:

#!/usr/bin/perl
$/ = undef;
$_ = <>; 

s#/\*[^*]*\*+([^/*][^*]*\*+)*/|([^/"']*("[^"\\]*(\\[\d\D][^"\\]*)*"[^/"']*|'[^'\\]*(\\[\d\D][^'\\]*)*'[^/"']*|/+[^*/][^/"']*)*)#$2#g;
print; 

C++ التعليقات:

#!/usr/local/bin/perl
$/ = undef;
$_ = <>;

s#//(.*)|/\*[^*]*\*+([^/*][^*]*\*+)*/|"(\\.|[^"\\])*"|'(\\.|[^'\\])*'|[^/"']+#  $1 ? "/*$1 */" : $& #ge;
print;

وأود أن جعل نسخ شريط التعليقات أولا ثم البحث في سلسلة الطريقة العادية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top