




Самый простой способ:
Regex xmlCommentsRegex = new Regex("<!--.*?-->", RegexOptions.Singleline | RegexOptions.Compiled);
И способ лучше:
Regex xmlCommentsRegex = new Regex("<!--(?:[^-]|-(?!->))*-->", RegexOptions.Singleline | RegexOptions.Compiled);
Разница только в производительности. Согласно моим тестам, у вас 118 шагов, а у моего 62 :)
Я не знаю о библиотеке регулярных выражений .net, но многие компиляторы регулярных выражений имеют оптимизацию для. *? так что это намного быстрее, чем наивный случай
НИКТО. Его нельзя описать контекстно-свободной грамматикой, на которой основано регулярное выражение.
Допустим, этот поток экспортируется в XML. Ваш пример (<! - FOO Bar ->), если он заключен в CDATA, будет потерян, хотя это не совсем комментарий.
«Правильный» способ - использовать XSLT и копировать все, кроме комментариев.
У меня не так много опыта работы с XSLT, но я могу попробовать это в будущем.
Анализ XML с помощью регулярного выражения считается плохим стилем. Используйте некоторую библиотеку синтаксического анализа 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 не поможет (что немного противоречит здравому смыслу).
Для моего простого тестового примера <! - (?: [^ -] | - (?! ->)) * -> эквивалентно моему собственному: <! - ([\ s \ S] *?) -> Мне чего-то не хватает?