Как на С# заменить блок "обработка текста" - регулярное выражение

toptop

Пользователь
Регистрация
01.10.2015
Сообщения
57
Благодарностей
1
Баллы
6
Привет друзья, подскажите плииз. Как этот блок перевести на C#

Т.е у нас есть какое-то регулярное выражение и мы ищем его в переменной test и кладем в переменную, например result. Как данные действия написать на кубике C#
кто-нибудь из гуру можешь подсказать :-)
 

surrealmix

Client
Регистрация
07.03.2013
Сообщения
715
Благодарностей
409
Баллы
63
Код:
var text = project.Variables["Text"].Value;
var pattern = @"регулярка";
var result = System.Text.RegularExpressions.Regex.Match(text, pattern).Value;
if(string.IsNullOrEmpty(result)) throw new Exception("Не найден текст регулярным выражением");
return result;
 
  • Спасибо
Реакции: nail2501, stanar и toptop

Nick

Client
Регистрация
22.07.2014
Сообщения
1 963
Благодарностей
796
Баллы
113
А стоит ли кидать исключение, если не нашлось? Не разумнее ли просто вернуть null, чтобы по красной стрелочке вышло?
 
  • Спасибо
Реакции: toptop

toptop

Пользователь
Регистрация
01.10.2015
Сообщения
57
Благодарностей
1
Баллы
6
Спасибо большое кодик рабочий и у меня к Вам как к профессионалам пару вопросов.
1. А какой код будет для вот этого кубика, т.е тут отличие в том что берется не одно совпадение а все и кладутся не в переменную а в таблицу.


2. Nick написал "А стоит ли кидать исключение, если не нашлось? Не разумнее ли просто вернуть null, чтобы по красной стрелочке вышло?"
Если я правильно разабрался, то это про четвертую строку из кода. Я попробовал если там результат пустой, то он идет по красной стрелочке. Или вы имели какое-то другое решение? Если не сложно расскажите мне незнайке что имели ввиду, так для общего развития хочется понимать
 

Nick

Client
Регистрация
22.07.2014
Сообщения
1 963
Благодарностей
796
Баллы
113
А вам точно в таблицу, а не в список?

Я имел в виду, что если отсутствие вхождений — не катастрофа, то я вместо
Код:
if(string.IsNullOrEmpty(result)) throw new Exception("Не найден текст регулярным выражением");
пишу
Код:
if(string.IsNullOrEmpty(result)) return null;
 

toptop

Пользователь
Регистрация
01.10.2015
Сообщения
57
Благодарностей
1
Баллы
6
А вам точно в таблицу, а не в список?

Я имел в виду, что если отсутствие вхождений — не катастрофа, то я вместо
Код:
if(string.IsNullOrEmpty(result)) throw new Exception("Не найден текст регулярным выражением");
пишу
Код:
if(string.IsNullOrEmpty(result)) return null;
да перепутал, в список результаты ложить. можете подсказать?

if(string.IsNullOrEmpty(result)) return null - буду сейчас разбираться в чем тут разница данных вариантов. спасибо
 

Nick

Client
Регистрация
22.07.2014
Сообщения
1 963
Благодарностей
796
Баллы
113
как-то так:

Код:
var parse = project.Variables["parse"].Value;
var regex = new Regex("���������");
var zp_list = project.Lists["������ 1"];

regex.Matches(parse).Cast<Match>().ToList().ForEach(m=>zp_list.Add(m.Value));
 
  • Спасибо
Реакции: toptop

toptop

Пользователь
Регистрация
01.10.2015
Сообщения
57
Благодарностей
1
Баллы
6
Ребята, это просто супер!!! Все работает. Сейчас даже нет слов) в таком восторге от ваших кодов. Буду разбираться чтобы потом самому можно такие же делать.
Спасибо всем Вам еще раз.:-)
 

toptop

Пользователь
Регистрация
01.10.2015
Сообщения
57
Благодарностей
1
Баллы
6
А у меня получилось такое регулярное выражение
var regtest = "(?<=class=\"hyp hypThumbnail\" href=\").*(?=\?count=500\">)";

все что надо заэкранировал только как мне быть с экранированием ? который идет перед count - это символ, который ищится, а не символ регулярного выражения. Ставлю \ но не работает, подскажите как быть уже всю голову сломал
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 707
Баллы
113
А у меня получилось такое регулярное выражение
var regtest = "(?<=class=\"hyp hypThumbnail\" href=\").*(?=\?count=500\">)";

все что надо заэкранировал только как мне быть с экранированием ? который идет перед count - это символ, который ищится, а не символ регулярного выражения. Ставлю \ но не работает, подскажите как быть уже всю голову сломал
Постите текст, откуда парсить и что парсить
 

toptop

Пользователь
Регистрация
01.10.2015
Сообщения
57
Благодарностей
1
Баллы
6
Вот код

Код:
var parse = project.Variables["GET"].Value;
var regtest = "(?<=class=\"hyp hypThumbnail\" href=\").*(?=\?count=500\">)";
var regex = new Regex(regtest);
var zp_list = project.Lists["model"];

regex.Matches(parse).Cast<Match>().ToList().ForEach(m=>zp_list.Add(m.Value));
вообще он работает, но в моем случае нет, пишут ошибку и это из-за того что в регулярном выражении ?count - вопрос это вопрос (а не знак регулярки), а я его если экранирую, то ошибка. вот и хочу узнать как правильно за экранировать его
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 707
Баллы
113
Это не то что я просил)
экранировать стандартно \?
можете приложить текст который парсить и что спарсить.
гадать смысла нет.
 

toptop

Пользователь
Регистрация
01.10.2015
Сообщения
57
Благодарностей
1
Баллы
6
на странице много ссылкой я беру всю страницу через гет и они имею такой вид
class="hyp hypThumbnail" href=site.ru/qweah192792?count=500">
class="hyp hypThumbnail" href="site.ru/qweah1956392?count=500">
class="hyp hypThumbnail" href="site.ru/qweah19492?count=500">
class="hyp hypThumbnail" href="site.ru/qweah1921392?count=500">

вот я для них и регулярку сделал через встроенный регулятор в зенке (?<=class="hyp\ hypThumbnail"\ href=").*(?=\?count=500">)
потом, убрав \ перед пробелами и поставив \ перед " вставил это ставил вот в С# код
но он не работает, ошибка идет на уровне \? - почему-то не получается экранировать знак вопроса. А если без него все ок - работает. Вот скрин
Код:
var parse = project.Variables["GET"].Value;
var regtest = "(?<=class=\"hyp hypThumbnail\" href=\").*(?=\?count=500\">)";
var regex = new Regex(regtest);
var zp_list = project.Lists["model"];
regex.Matches(parse).Cast<Match>().ToList().ForEach(m=>zp_list.Add(m.Value));



 

Nick

Client
Регистрация
22.07.2014
Сообщения
1 963
Благодарностей
796
Баллы
113
перед тем обратным слэшем, который нужен для регекспа, нужно поставить экранирующий обратный слэш, нужный для c#
то есть просто ещё один \ добавить
 
  • Спасибо
Реакции: toptop

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 707
Баллы
113
можно просто написать var regtest = @"прорп"
вместо var regtest = "прорп"
 

Nick

Client
Регистрация
22.07.2014
Сообщения
1 963
Благодарностей
796
Баллы
113
с какой версии это начало работать? у меня в 5.7.5.3 оно почему-то не фурычит
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 707
Баллы
113
всегда так делал, не знаю))
 

Nick

Client
Регистрация
22.07.2014
Сообщения
1 963
Благодарностей
796
Баллы
113

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 039
Баллы
113
  • Спасибо
Реакции: Nick

CSS

Client
Регистрация
22.05.2010
Сообщения
1 327
Благодарностей
663
Баллы
113
Проще в переменную регулярку положить, чем возиться с экранированиями
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 039
Баллы
113

CSS

Client
Регистрация
22.05.2010
Сообщения
1 327
Благодарностей
663
Баллы
113
если я делаю всё в одном кубике, зачем мне 100 лишних переменных
Под каждую задачу свой инструмент, я предложил альтернативу для случая когда экранировать значит увеличивать накладные расходы. Можно также и в 1 переменной хранить множество регулярок, или просто в файле их хранить, 1 строка = 1 регулярка. По своему опыту замечаю что встречаются регулярки которые просто дольше экранировать. Конечно если у вас регулярка вида "\d+" то ничего в переменную заносить нет смысла.
 

toptop

Пользователь
Регистрация
01.10.2015
Сообщения
57
Благодарностей
1
Баллы
6
перед тем обратным слэшем, который нужен для регекспа, нужно поставить экранирующий обратный слэш, нужный для c#
то есть просто ещё один \ добавить
спасибо помогло


можно просто написать var regtest = @"прорп"
вместо var regtest = "прорп"
А что дает знак @, в чем его функция?

Проще в переменную регулярку положить, чем возиться с экранированиями
а всеравно же когда кладешь в переменную там надо экранировать, я правильно понимаю что будет просто вот так

var test = "(?<=class=\"hyp hypThumbnail\" href=\").*(?=\\?count=500\">)";
var regex = new Regex(test);
или ты имеешь ввиду добавлять через кубики, а потом уже просто брать в С# через project.Variables["testtest"].Value ?


А еще такой вопрос, добавляю я все найденные значения - потом беру их и удаляю - потом в этот список добавляю другие - потом беру их и удаляю - и т.д по циклю.
Надо ли в этом случае добавлять лок (или блок) списка после того как нашли все значения, чтобы как я правильно понимаю все значения успели добавиться, а только потом можно было их удалить, а то они не успеют добавиться а их удалят? вот с этим локом не разобрался до конца, подскажите плиз.
 

CSS

Client
Регистрация
22.05.2010
Сообщения
1 327
Благодарностей
663
Баллы
113
а всеравно же когда кладешь в переменную там надо экранировать, я правильно понимаю что будет просто вот так

var test = "(?<=class=\"hyp hypThumbnail\" href=\").*(?=\\?count=500\">)";
var regex = new Regex(test);
или ты имеешь ввиду добавлять через кубики, а потом уже просто брать в С# через project.Variables["testtest"].Value ?
Я имею ввиду добавлять сюда:
2015-10-08 18_03_22-ProjectMaker for ZennoPoster v5.9.3.1 by ZennoLab.com.png

И как вы описали вставлять через project.Variables["testtest"].Value, в таком случае экранирование не требуется
 
  • Спасибо
Реакции: toptop

Nick

Client
Регистрация
22.07.2014
Сообщения
1 963
Благодарностей
796
Баллы
113
Я обязательно начну так делать в 2034 году, когда в «Конструкторе регулярок» появится кнопка «Перенести регулярку в новую переменную» :D
 

bhairava7

Client
Регистрация
18.08.2015
Сообщения
154
Благодарностей
15
Баллы
18
А что дает знак @, в чем его функция?
В php это подавление ошибок, в c# вероятно тоже.

а всеравно же когда кладешь в переменную там надо экранировать, я правильно понимаю что будет просто вот так
var test = "(?<=class=\"hyp hypThumbnail\" href=\").*(?=\\?count=500\">)";
еще пробелы надо экранировать вроде "\ " или так "\s".
 

Nick

Client
Регистрация
22.07.2014
Сообщения
1 963
Благодарностей
796
Баллы
113
Если не знаете, то лучше не пишите. Собачка «подавлением ошибок» не занимается; пробелы экранировать не надо.
 

bhairava7

Client
Регистрация
18.08.2015
Сообщения
154
Благодарностей
15
Баллы
18
Если не знаете, то лучше не пишите. Собачка «подавлением ошибок» не занимается; пробелы экранировать не надо.
Ну и кто не знает-то из нас?

@ игнорирует ошибки, т.е. можно сказать подавляет их вывод. Тыц.
Пробелы экранировать надо в некоторых случаях, сталкивался с примером, где без экранирования пробелов не получалось спарсить.
 
Последнее редактирование:

Nick

Client
Регистрация
22.07.2014
Сообщения
1 963
Благодарностей
796
Баллы
113

bhairava7

Client
Регистрация
18.08.2015
Сообщения
154
Благодарностей
15
Баллы
18

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)