Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
koc94ok
12 / 12 / 2
Регистрация: 22.04.2010
Сообщений: 562
1

Регулярное выражение изъятие тегов

05.03.2014, 18:11. Просмотров 2093. Ответов 25
Метки нет (Все метки)

Не могу понять почему не работает? Подскажите что да как..
C#
1
2
3
4
5
6
7
8
 const string patternnao = @"(?<=<div class=""item"">).+?(?=</div>)";
            Regex rnao = new Regex(patternnao, RegexOptions.IgnoreCase);
 
            MatchCollection matches = rnao.Matches(html);
            foreach (Match matche in matches)
            {
                label1.Text = matche.Value;
            }
Должно извлекать и перебирать все теги div с классом item, но не делает этого...
HTML5
1
<div class="item">123</div>***<div class="item">456</div>
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.03.2014, 18:11
Ответы с готовыми решениями:

Регулярное выражение для тегов
Не могу додуматься, как сделать так чтобы выражение что в тэги t было все синие(одним и вторым...

Регулярное выражение для удаление тегов XML
Подскажите пожалуйста каким регулярным выражением можно удалить все XML теги. Например: &lt;name&gt;Дядя...

Регулярное выражение для тегов (прописью|ЗАГЛАВНЫМИ)
хмммм столкнулся с проблемой, как указать в выражении что тег может быть написан с прописной и с...

Регулярные выражение. Вытащить информацию из тегов<td></td>
Всем доброго времени суток. Мне нужно вытащить информацию из тегов&lt;td&gt;&lt;/td&gt; и &lt;span&gt;&lt;/span&gt;. ...

Регулярное выражение
Описать функцию, которая удаляет из заданной строковой величины все лишние пробелы. Пробелы...

25
valera_21
405 / 379 / 104
Регистрация: 05.01.2010
Сообщений: 1,599
Завершенные тесты: 5
05.03.2014, 18:12 2
а зачем у вас по 2 кавычки вокруг item в регулярке?
0
koc94ok
12 / 12 / 2
Регистрация: 22.04.2010
Сообщений: 562
05.03.2014, 20:14  [ТС] 3
Цитата Сообщение от valera_21 Посмотреть сообщение
а зачем у вас по 2 кавычки вокруг item в регулярке?
уберите и узнаете

Данный div содержит внутренние div'ы, т.е. тег должен изыматься полностью со всем нутром...
0
Psilon
Master of Orion
Эксперт .NET
6055 / 4913 / 903
Регистрация: 10.07.2011
Сообщений: 14,520
Записей в блоге: 5
Завершенные тесты: 4
05.03.2014, 20:16 4
koc94ok, ну регулярка правильная. Значит, неправильно формулируете задачу, я бы понял также, как и машина

Покажите пример, на котором машина отрабатывает неправильно, а ниже напишите желаемый результат.
0
koc94ok
12 / 12 / 2
Регистрация: 22.04.2010
Сообщений: 562
05.03.2014, 20:32  [ТС] 5
Цитата Сообщение от Psilon Посмотреть сообщение
koc94ok, ну регулярка правильная. Значит, неправильно формулируете задачу, я бы понял также, как и машина
Покажите пример, на котором машина отрабатывает неправильно, а ниже напишите желаемый результат.
HTML5
1
<div class="item">123</div>***<div class="item"><div class="main">456</div></div>
Количество DIV не известно, поэтому желательно через foreach все это...

Тянем содержимое тегов
<div class="item"></div>

Результат:
123
<div class="main">456</div>
0
Psilon
Master of Orion
Эксперт .NET
6055 / 4913 / 903
Регистрация: 10.07.2011
Сообщений: 14,520
Записей в блоге: 5
Завершенные тесты: 4
05.03.2014, 20:35 6
koc94ok, а вместо этого выводит
123
<div class="main">456
?
0
koc94ok
12 / 12 / 2
Регистрация: 22.04.2010
Сообщений: 562
05.03.2014, 20:38  [ТС] 7
Цитата Сообщение от Psilon Посмотреть сообщение
koc94ok, а вместо этого выводит
Ничего не выводит, да и я сомневаюсь в правильности регулярки...
0
Psilon
Master of Orion
Эксперт .NET
6055 / 4913 / 903
Регистрация: 10.07.2011
Сообщений: 14,520
Записей в блоге: 5
Завершенные тесты: 4
05.03.2014, 20:45 8
koc94ok, ну у меня вывелось то, что я написал (для вашего тестового варианта).
Надо подумать

Добавлено через 2 минуты
А в принципе я не уверен, что регэкспы умеют в рекурсивные вложенные выражения. У них есть конструкции обратных ссылок, а вот подсчет вложенности - сомневаюсь.

Добавлено через 3 минуты
http://stackoverflow.com/questions/5...outer-brackets
0
koc94ok
12 / 12 / 2
Регистрация: 22.04.2010
Сообщений: 562
05.03.2014, 21:06  [ТС] 9
Цитата Сообщение от Psilon Посмотреть сообщение
А в принципе я не уверен, что регэкспы умеют в рекурсивные вложенные выражения. У них есть конструкции обратных ссылок, а вот подсчет вложенности - сомневаюсь.
Может через XML или прочие приблуды как-то? Должен же быть способ...
0
Psilon
Master of Orion
Эксперт .NET
6055 / 4913 / 903
Регистрация: 10.07.2011
Сообщений: 14,520
Записей в блоге: 5
Завершенные тесты: 4
05.03.2014, 21:07 10
koc94ok, ну можно через xtmlagilitypack. Если встроенными средставми, то думаю можно через обычный XML считать.
0
koc94ok
12 / 12 / 2
Регистрация: 22.04.2010
Сообщений: 562
05.03.2014, 21:11  [ТС] 11
Цитата Сообщение от Psilon Посмотреть сообщение
koc94ok, ну можно через xtmlagilitypack. Если встроенными средставми, то думаю можно через обычный XML считать.
Ни с тем ни с другим не знаком увы( Все равно нужна помощь со стороны...
Однако все же думаю может реально организовать регулярку? Количество вложенных дивов(2) известно и их классы тоже, однако такую сложную регулярку я тоже не осилю... Не знаю как быть
0
Psilon
Master of Orion
Эксперт .NET
6055 / 4913 / 903
Регистрация: 10.07.2011
Сообщений: 14,520
Записей в блоге: 5
Завершенные тесты: 4
05.03.2014, 21:18 12
Лучший ответ Сообщение было отмечено koc94ok как решение

Решение

C#
1
2
3
4
5
6
7
8
9
10
11
            string s = @"<body><div class=""item"">123</div>***<div class=""item""><div class=""main"">456</div></div></body>";
            using (var sr = new StringReader(s))
            {
                var xdoc = XDocument.Load(sr);
                var elements = xdoc.Descendants("div").Where(x => x.Attribute("class").Value == "item");
                foreach (var element in elements)
                {
                    Console.WriteLine(element.FirstNode);
                }
 
            }
Добавлено через 1 минуту
C#
1
using System.Xml.Linq;
0
koc94ok
12 / 12 / 2
Регистрация: 22.04.2010
Сообщений: 562
05.03.2014, 21:24  [ТС] 13
Цитата Сообщение от Psilon Посмотреть сообщение
Добавлено через 1 минуту
Результат 123;456, во втором случае main цепляет почему-то...
0
Psilon
Master of Orion
Эксперт .NET
6055 / 4913 / 903
Регистрация: 10.07.2011
Сообщений: 14,520
Записей в блоге: 5
Завершенные тесты: 4
05.03.2014, 21:26 14
koc94ok, ну у меня все норм, правда код немного изменил:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using System;
using System.IO;
using System.Linq;
using System.Xml.Linq;
 
namespace ConsoleApplication12
{
    class Program
    {
        static void Main()
        {
            string s = @"<body><div class=""item"">123</div>***<div class=""item""><div class=""main"">456</div></div></body>";
            using (var sr = new StringReader(s))
            {
                var xdoc = XDocument.Load(sr);
                var elements = xdoc.Descendants("div")
                                   .Where(x => x.Attribute("class").Value == "item")
                                   .Select(element => string.Join(Environment.NewLine, element.Nodes()));
                foreach (string value in elements)
                {
                    Console.WriteLine(value);
                }
            }
        }
    }
}
1
Миниатюры
Регулярное выражение изъятие тегов  
koc94ok
12 / 12 / 2
Регистрация: 22.04.2010
Сообщений: 562
06.03.2014, 00:20  [ТС] 15
Цитата Сообщение от Psilon Посмотреть сообщение
koc94ok, ну у меня все норм, правда код немного изменил:
Для xml действительно все ок, но у меня корявая страница html, возможно как-нибудь через регулярку сделать? Формат всех div'ов стандартен и выглядит примерно:
HTML5
1
2
3
4
5
6
7
<div class="item">                <img class="small" src="***" alt="***" />
                <div class="name">
                    <b> Username</b><br /><span class="like">***</span>***                     <span class="type">***</span>
                    <small></small>
                </div>
                <div class="cafe">***</div>
                        </div>
Т.е. формат один внешний div класса item содержимое которого нам нужно, и два вложенных тоже с постоянными классами, может возможно какую-то регулярку в таких условиях? Результаты нужны те же foreach с перечислением содержимого <div class="item"> тегов.
0
Psilon
Master of Orion
Эксперт .NET
6055 / 4913 / 903
Регистрация: 10.07.2011
Сообщений: 14,520
Записей в блоге: 5
Завершенные тесты: 4
06.03.2014, 02:30 16
koc94ok, не верю, что все это не обернуто в какой-то глобальный тег типа head.

Ну а если его нет и данные реально в таком виде приходят, то нужно его добавить, иначе XML не сможет его распарсить, для XML обязан быть один корневой элемент.
0
koc94ok
12 / 12 / 2
Регистрация: 22.04.2010
Сообщений: 562
06.03.2014, 10:46  [ТС] 17
Цитата Сообщение от Psilon Посмотреть сообщение
koc94ok, не верю, что все это не обернуто в какой-то глобальный тег типа head.
Ну а если его нет и данные реально в таком виде приходят, то нужно его добавить, иначе XML не сможет его распарсить, для XML обязан быть один корневой элемент.
"doctype" не является допустимым маркером. Ожидается маркер "DOCTYPE"., строка 1, позиция 15.

Всё это находится в глобальном div, который я целиком выдёргиваю и потом оборачиваю в <head> </head>

Тогда пишет: Ссылка на объект не указывает на экземпляр объекта.

C#
1
 x.Attribute("class").Value == "item"
Помоги с регуляркой плз, если таковая тут возможна по примеру выше...
0
Psilon
Master of Orion
Эксперт .NET
6055 / 4913 / 903
Регистрация: 10.07.2011
Сообщений: 14,520
Записей в блоге: 5
Завершенные тесты: 4
06.03.2014, 11:04 18
koc94ok, еще раз, выше вы привели опять кусок файла. Скиньте целиком весь текст, который хотите обработать, чтобы сразу сделать, а не двигаться вперед по шажочкам.
0
koc94ok
12 / 12 / 2
Регистрация: 22.04.2010
Сообщений: 562
06.03.2014, 18:28  [ТС] 19
Цитата Сообщение от Psilon Посмотреть сообщение
koc94ok, еще раз, выше вы привели опять кусок файла. Скиньте целиком весь текст, который хотите обработать, чтобы сразу сделать, а не двигаться вперед по шажочкам.
Скинул в лс пример целиком... все же надеюсь на какое-то решение, не важно xml или регулярки, хоть что-нибудь...
0
Psilon
Master of Orion
Эксперт .NET
6055 / 4913 / 903
Регистрация: 10.07.2011
Сообщений: 14,520
Записей в блоге: 5
Завершенные тесты: 4
06.03.2014, 18:49 20
koc94ok, в общем я попробовал, очень много ошибок в разметке, он даже не соответствует XHTML 1.1, не говоря про более строгие стандарты. Поэтому XDoc'ом не получится распарсить. Например, с точки зрения XML тэг <img src="blabla.jpg"> не является валидным, т.к. тэг без тела должен заканчиваться на />, а тут сплошь и рядом такое. Поэтому придется все же HtmlAgilityPack'ом пользоваться. Уж насколько я не люблю сторонние инструменты, но делать нечего
0
06.03.2014, 18:49
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.03.2014, 18:49

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Регулярное выражение
Есть строки такого вида 1 Kilburn NW6 United Kingdom England Greater London 51.553/-0.192...

Регулярное выражение
Помогите написать регулярное выражение на С# для такой строки &lt;form...

Регулярное выражение
Имеется текст, в нем есть сумма, разделенная произвольным кол-вом пробелов(2 3 453 556 )после...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.