#c# #xml #regex #.net-fiddle
#c# #xml #регулярное выражение #.net-fiddle
Вопрос:
Я пытаюсь отфильтровать недопустимые символы из XML-файла и выполнить следующий тестовый проект;
class Program
{
private static Regex _invalidXMLChars = new Regex(@"(?<![uD800-uDBFF])[uDC00-uDFFF]|[uD800-uDBFF](?![uDC00-uDFFF])|[x00-x08x0Bx0Cx0E-x1Fx7F-x9FuFEFFuFFFEuFFFF]", RegexOptions.Compiled);
static void Main(string[] args)
{
var text = "assdamp;#xF;abv";
Console.WriteLine(_invalidXMLChars.IsMatch(text));
}
}
Этот тестовый проект выдает ожидаемый результат (True) с помощью .ЧИСТАЯ скрипка;
Но когда я пытаюсь реализовать тот же код в своем проекте, недопустимые символы не найдены и выдает «False».
Почему это работает в .NET fiddle, но не в моем проекте?
Изменение исходного XML-файла не является вариантом
Комментарии:
1. более 50% случаев, когда я видел, как люди задают подобные вопросы, это потому, что они забыли использовать строку после замены на более позднем этапе. Например.
string dirty = xxx; var clean = regex.Replace(dirty,""); ...; doSomething = ParseXml(dirty);
Но поскольку вы не показали свой фактический код, который показывает вашу проблему, невозможно быть уверенным.2. Тестовый проект, который у меня есть в .NET fiddle, точно такой же, как у меня в Visual Studio, но он дает разные результаты.
Ответ №1:
Visual Studio права. Ни один из символов amp;
, #
, x
, F
или ;
не является частью вашего регулярного выражения. Однако в HTML amp;#xF;
преобразуется в C # pendant u000f
, который затем заменяется из-за определения регулярных xE-x1F
выражений.
Использование u000f
в Visual Studio дает совпадение:
using System;
using System.Text.RegularExpressions;
public class Program
{
private static Regex _invalidXMLChars = new Regex(@"(?<![uD800-uDBFF])[uDC00-uDFFF]|[uD800-uDBFF](?![uDC00-uDFFF])|[x00-x08x0Bx0Cx0E-x1Fx7F-x9FuFEFFuFFFEuFFFF]", RegexOptions.Compiled);
public static void Main()
{
var text = "assdu000fabv";
Console.WriteLine(_invalidXMLChars.IsMatch(text));
}
}
Ответ №2:
Регулярное выражение не применяется, поскольку строка содержит экранированную последовательность, которая позже отобразит «недопустимый» символ.
Чтобы отфильтровать это, вам придется отменить экранирование строки перед тестированием регулярного выражения:
static void Main(string[] args)
{
var text = System.Web.HttpUtility.HtmlDecode("assdamp;#xF;abv");
Console.WriteLine(_invalidXMLChars.IsMatch(text));
}
Вторым вариантом было бы использовать регулярное выражение для сопоставления с escape-последовательностью:
var text2 = "assdamp;#xF;abv";
var rx = new Regex(@"amp;#x[0-9A-F];");
Console.WriteLine(rx.IsMatch(text2));
Надеюсь, это поможет!