.NET fiddle / Visual Studio: разные результаты для замены регулярных выражений на недопустимый символ XML

#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));
 

Надеюсь, это поможет!