c# помогите с Regex

84
18 апреля 2021, 08:40

нужно из текста выделить такую строку:

<coverpage><image l:href="#cover.jpg"/></coverpage>

составил регэксп @"<coverpage><image l:href=""#(.*?)""/></coverpage>"
совпадений нет
проверил на сайте https://regex101.com/r/zcTpqR/2
работает, правда вот такой \" вариант кавычек, а в проге не работает
"<coverpage><image l:href=\"#(.*?)\"/></coverpage>"

UPD:

xdoc = new XDocument();
xdoc = XDocument.Load(opf.FileName);
string xdocstr = xdoc.ToString();
string t1 = Regex.Replace(xdocstr, @"<FictionBook[^>]*>", "<FictionBook>");//убираю неймспейсы потому что уже голова болит от возни с ними
MatchCollection mcol = Regex.Matches(t1, @"<coverpage><image l:href=""#(.*?)""/></coverpage>");
string coverStr = "";
foreach (Match m in mcol)
{
    coverStr += m.Groups[1].Value + "\n";//строка пустая
}

Весь текст книги не буду выкладывать, он большой. Если пригодится то вот полный файл https://yadi.sk/d/NKpYCB4UoZlXLw

<?xml version="1.0" encoding="utf-8"?>
<FictionBook xmlns="http://www.gribuser.ru/xml/fictionbook/2.0" xmlns:l="http://www.w3.org/1999/xlink">
    <description>
        <title-info>
            <genre>sf</genre>
            <author>
                <first-name>Айзек</first-name>
                <last-name>Азимов</last-name>
            </author>
            <book-title>Профессия</book-title>
            <annotation>
                <i>
                На Земле, по прошествии 4-5 тысяч лет система образования, естественно, претерпела массу изменений и нововедений. В восемь лет все дети должны были пройти День Чтения, когда соответствующая программа с ленты, обучающей чтению, за 15 минут переписывалась в мозг ребенка. В 18 лет на Дне Знаний компьютер выбирал для человека его оптимальную профессию и закладывал в его мозг соответствующую программу. Затем каждый год проводились Олимпиады, где планеты, требующие специалистов, отбирали себе лучших.
                Джордж Пленетей страстно хотел стать программистом и тайком от всех изучал книги по програмированию. Но в 18 лет в День знаний компьютер выбрал ему совсем другую специальность.
                </i>
            </annotation>
            <date>1957</date>
            <1--  вот это нужно достать -->
            <coverpage><image l:href="#cover.jpg"/></coverpage>
            <lang>ru</lang>
            <src-lang>en</src-lang>
            <translator>
                <first-name>Светлана</first-name>
                <last-name>Васильева</last-name>
            </translator>
            <sequence number='0' name='Шедевры фантастики'/>
        </title-info>
Answer 1

Метод XDocument.ToString возвращает форматированный xml с пробельными символами. Поэтому ваша регулярка ничего не находит.

var xdoc = XDocument.Load("test.xml");
string xdocstr = xdoc.ToString(); // здесь получаем форматированный xml

Вы уже сами нашли решение: добавить в шаблон пробелы \s*.

Если вы используете регулярные выражения, то XDocument вас не нужен. Можете полностью убрать его использование из кода.

Просто читайте из файла текст и работайте с ним.

var xml = File.ReadAllText(opf.FileName);
var pattern = @"<coverpage><image l:href=""#(.*?)""/></coverpage>";
var matches = Regex.Matches(xml, pattern);

Хотя и в этом случае следует учитывать пробельные символы. По стандарту они могут присутствовать в xml в любом месте с любом количестве. То есть они могут быть в самом файле изначально.

Но гораздо правильней работать с fb2 с помощью xml-парсеров. Регулярки при этом совершенно не нужны.

Достаточно определить имеющиеся в этом формате пространства имён и далее использовать их.

XNamespace fb = "http://www.gribuser.ru/xml/fictionbook/2.0";
XNamespace link = "http://www.w3.org/1999/xlink";
var xdoc = XDocument.Load("test.xml");
var images = xdoc.Descendants(fb + "coverpage").Elements(fb + "image");
string coverStr = null;
foreach (var image in images)
{
    Console.WriteLine(image.Attribute(link + "href").Value);
    coverStr += image.Attribute(link + "href").Value;
}

Обратите внимание: я просто присоединяю неймспейс к имени элемента: fb + "coverpage". Аналогично поступаем с атрибутом.

READ ALSO
ToolStripMenuItem.CheckState

ToolStripMenuItem.CheckState

Вообще сбрасывается значение ToolStripMenuItemCheckState в false

99
Получить название колонки БД для показа оставшихся размеров товара

Получить название колонки БД для показа оставшихся размеров товара

Существует модель размеров ProductSize, где есть свойства:

96
Куда спрятать функцию C#?

Куда спрятать функцию C#?

Есть функция которая проверяет привязку по железу, нужно её спрятать что бы при реверсе было сложнее отыскатьНужно что бы она выполнялась...

115