سؤال

لقد واجهت الحاجة إلى إزالة التعليقات من النموذج:

<!--  Foo

      Bar  -->

أرغب في استخدام تعبير منتظم يطابق أي شيء (بما في ذلك استراحات السطر) بين المحددين البداية والنهاية ".

ماذا سيكون ريجيكس جيدة لهذه المهمة؟

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

المحلول

الطريقة البسيطة:

Regex xmlCommentsRegex = new Regex("<!--.*?-->", RegexOptions.Singleline | RegexOptions.Compiled);

وسيلة أفضل:

Regex xmlCommentsRegex = new Regex("<!--(?:[^-]|-(?!->))*-->", RegexOptions.Singleline | RegexOptions.Compiled);

نصائح أخرى

لا أحد. لا يمكن وصفه من قبل القواعد الحرة السياق، والتي يعتمد التعبير العادي عليه.

دعنا نقول أن هذا الموضوع يتم تصديره في XML. مثال الخاص بك (u003C!-- FOO Bar --> )، إذا تم إرفاقها في CDATA، فسوف تضيع، في حين أنها ليست مجرد تعليق.

ستكون الطريقة "المناسبة" هي استخدام XSLT ونسخ كل شيء ولكن التعليقات.

يعتبر تحليل XML مع Regex نمطا سيئا. استخدم بعض مكتبة تحليل XML.

فيما يلي بعض رمز نموذج كامل لقراءة ملف XML في، وإرجاع سلسلة هي الملف بدون تعليقات.

var text = File.ReadAllText("c:\file.xml");
{ 
  const string strRegex = @"<!--(?:[^-]|-(?!->))*-->";
  const RegexOptions myRegexOptions = RegexOptions.Multiline;
  Regex myRegex = new Regex(strRegex, myRegexOptions);
  string strTargetString = text;
  const string strReplace = @""; 

  string result = myRegex.Replace(strTargetString, strReplace);
  return result;
}

لسوء الحظ، RegexOptions.Multiline وحده لن يفعل الخدعة (وهو أمر مضاد قليلا).

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