[SOLVED] Проблема в понимании Regex c# или как сделать "вкусной регулярку"*?

  • Автор темы Автор темы grin-du
  • Дата начала Дата начала

grin-du

Client
Регистрация
09.10.2017
Сообщения
96
Реакции
46
Баллы
18
Код:
Развернуть Свернуть Копировать
var dom = instance.ActiveTab.DomText;
string regex = "(?<=<span\\ class=\"price-value\">)[\\w\\W]*(?=\\ \\ </span>\\ </div>)";
string str1 =  project.Variables["money"].Value;
var reg = new System.Text.RegularExpressions.Regex(regex,  System.Text.RegularExpressions.RegexOptions.None);
if(reg.Matches(str1).Count > 0)
    project.Variables["money"].Value = reg.Matches(str1).ToString();
    return reg.Matches(str1).Count;
Код не кушает мою регулярку типа: (?<=<span\ class="price-value">)[\w\W]*(?=\ \ </span>\ </div>)
Как сделать её кошерной и правилен ли сам код? Нужно по итогу, чтобы прилетало значение в переменную проекта.
 
покорми да крылья приделай ), может схавает да полетит )
 
Код:
Развернуть Свернуть Копировать
var dom = instance.ActiveTab.DomText;
string regex = "(?<=<span\\ class=\"price-value\">)[\\w\\W]*(?=\\ \\ </span>\\ </div>)";
string str1 =  project.Variables["money"].Value;
var reg = new System.Text.RegularExpressions.Regex(regex,  System.Text.RegularExpressions.RegexOptions.None);
if(reg.Matches(str1).Count > 0)
    project.Variables["money"].Value = reg.Matches(str1).ToString();
    return reg.Matches(str1).Count;
Код не кушает мою регулярку типа: (?<=<span\ class="price-value">)[\w\W]*(?=\ \ </span>\ </div>)
Как сделать её кошерной и правилен ли сам код? Нужно по итогу, чтобы прилетало значение в переменную проекта.
В сишарпе обычно экранируются слеши, бэкслеши и кавычки. И кавычки, порой лучше экранировать кавычками. Почитайте документацию.

Самый простой способ облегчить себе жизнь - поместить полученное в конструкторе регулярное выражение в поле Искомый текст всегда начинается с. Конструктор заэкранирует слеши и пробелы, останется только разобраться с кавычками.
 
Последнее редактирование:
  • Спасибо
Реакции: grin-du и Koqpe
Код:
Развернуть Свернуть Копировать
var dom = instance.ActiveTab.DomText;
string regex = "(?<=<span\\ class=\"price-value\">)[\\w\\W]*(?=\\ \\ </span>\\ </div>)";
string str1 =  project.Variables["money"].Value;
var reg = new System.Text.RegularExpressions.Regex(regex,  System.Text.RegularExpressions.RegexOptions.None);
if(reg.Matches(str1).Count > 0)
    project.Variables["money"].Value = reg.Matches(str1).ToString();
    return reg.Matches(str1).Count;
Код не кушает мою регулярку типа: (?<=<span\ class="price-value">)[\w\W]*(?=\ \ </span>\ </div>)
Как сделать её кошерной и правилен ли сам код? Нужно по итогу, чтобы прилетало значение в переменную проекта.
немного экранирования и регулярка работает)
PHP:
Развернуть Свернуть Копировать
string regex = @"(?<=<span\\ class=\""price-value\"">)[\\w\\W]*(?=\\ \\ </span>\\ </div>)";
хотя, может и не будет работать... надо проверить на готовом тексте. Сам код ошибки не выдает, но именно как регулярка может и не отработать
или такой вариант попробуй
PHP:
Развернуть Свернуть Копировать
string regex = @"(?<=<span\ class=""price-value"">)[\w\W]*(?=\ \ </span>\ </div>)";
 
Последнее редактирование:
немного экранирования и регулярка работает)
PHP:
Развернуть Свернуть Копировать
string regex = @"(?<=<span\\ class=\""price-value\"">)[\\w\\W]*(?=\\ \\ </span>\\ </div>)";
хотя, может и не будет работать... надо проверить на готовом тексте. Сам код ошибки не выдает, но именно как регулярка может и не отработать
или такой вариант попробуй
PHP:
Развернуть Свернуть Копировать
string regex = @"(?<=<span\ class=""price-value"">)[\w\W]*(?=\ \ </span>\ </div>)";
Код выполняется вроде нормально, но выдает не значение, которое ищу, а 0.
 

Вложения

  • 2018-01-30_15-31-46.png
    2018-01-30_15-31-46.png
    3,5 KB · Просмотры: 599
а какая именно строка использовалась с регуляркой - первый вариант или второй?
Оба. У меня в коде идет парсит с дом по идее, но я объявил переменную, а к коде она дальше работает где-нибудь?
 
а какая именно строка использовалась с регуляркой - первый вариант или второй?
Код:
Развернуть Свернуть Копировать
var dom = instance.ActiveTab.DomText;
string regex = @"(?<=<span\\ class=\""price-value\"">)[\\w\\W]*(?=\\ \\ </span>\\ </div>)";
string str1 =  project.Variables["money"].Value;
var reg = new System.Text.RegularExpressions.Regex(regex,  System.Text.RegularExpressions.RegexOptions.None);
if(reg.Matches(dom).Count > 0)
    project.Variables["money"].Value = reg.Matches(dom).ToString();
    return reg.Matches(dom).Count;


    //str1 = str1.Replace("&nbsp;","").ToString().Trim();
    //project.Variables["money"].Value = str1;
попробовал еще так, но тоже 0 отдает.
 
Оба. У меня в коде идет парсит с дом по идее, но я объявил переменную, а к коде она дальше работает где-нибудь?
ну ты dom передай в переменую если надо для другого кубика
если только в этом куске кода то парсь с dom а не из переменой
 
Code=csharp, в скобках
так надо и только в начале
 
ну ты dom передай в переменую если надо для другого кубика
если только в этом куске кода то парсь с dom а не из переменой
C#:
Развернуть Свернуть Копировать
var dom = instance.ActiveTab.DomText;
string regex = @"(?<=<span\\ class=\""price-value\"">)[\\w\\W]*(?=\\ \\ </span>\\ </div>)";
string str1 =  project.Variables["money"].Value;
var reg = new System.Text.RegularExpressions.Regex(regex,  System.Text.RegularExpressions.RegexOptions.None);
if(reg.Matches(dom).Count > 0)
    project.Variables["money"].Value = reg.Matches(dom).ToString();
    return reg.Matches(dom).Count;
Ну вот так? Если так то 0 отдает(
 
регулярка по идеи не должна сработать, слэш перед кавычками не нужен, ты их уже экранировал кавычкой

приведи пример с чего парсишь, что тут гаданием заниматься
 
  • Спасибо
Реакции: grin-du
регулярка по идеи не должна сработать, слэш перед кавычками не нужен, ты их уже экранировал кавычкой

приведи пример с чего парсишь, что тут гаданием заниматься
C#:
Развернуть Свернуть Копировать
var dom = instance.ActiveTab.DomText;
string regex = @"(?<=<span\\ class=""price-value"">)[\\w\\W]*(?=\\ \\ </span>\\ </div>)";
string str1 =  project.Variables["money"].Value;
var reg = new System.Text.RegularExpressions.Regex(regex,  System.Text.RegularExpressions.RegexOptions.None);
if(reg.Matches(instance.ActiveTab.DomText).Count > 0)
    project.Variables["money"].Value = reg.Matches(instance.ActiveTab.DomText).ToString();
    return reg.Matches(instance.ActiveTab.DomText).Count;
Вот так попробовал, опять 0 отдает( Исходная регулярка (?<=<span\ class="price-value">)[\w\W]*(?=\ \ </span>\ </div>)
 
[\\w\\W]* это не верно
 
C#:
Развернуть Свернуть Копировать
var dom = instance.ActiveTab.DomText;
string regex = @"(?<=<span\\ class=""price-value"">)[\\w\\W]*(?=\\ \\ </span>\\ </div>)";
string str1 =  project.Variables["money"].Value;
var reg = new System.Text.RegularExpressions.Regex(regex,  System.Text.RegularExpressions.RegexOptions.None);
if(reg.Matches(instance.ActiveTab.DomText).Count > 0)
    project.Variables["money"].Value = reg.Matches(instance.ActiveTab.DomText).ToString();
    return reg.Matches(instance.ActiveTab.DomText).Count;
Вот так попробовал, опять 0 отдает( Исходная регулярка (?<=<span\ class="price-value">)[\w\W]*(?=\ \ </span>\ </div>)

не правильно, ты пример строки дай
 
да, пример DOM-страницы не помешал бы
 
C#:
Развернуть Свернуть Копировать
string regex = @"(?<=""price-value"">)[\w\W]*(?=\ \ </span>)";
такую регулярку попробуй
 
Отдает результат 1
хорошо, а такой вариант кода?
Код:
Развернуть Свернуть Копировать
string dom = instance.ActiveTab.DomText;
string regex = @"(?<=""price-value"">)[\w\W]*(?=\ \ </span>)";
string reg = new Regex(regex).Match(dom).Value;
 
  • Спасибо
Реакции: grin-du
добавляешь using System.Net;

C#:
Развернуть Свернуть Копировать
var dom = instance.ActiveTab.DomText;
dom = WebUtility.HtmlDecode(dom);

string regex = @"(?<=<span\ class=""price-value"">)[\w\W]*?(?=</span>)";

var reg = new Regex(regex,  RegexOptions.None);

if(reg.Matches(dom).Count > 0)
{
    project.Variables["money"].Value = reg.Match(dom).ToString().Replace("\r\n", "").Trim();
    return "es";
}

return reg.Matches(dom).Count;
 
  • Спасибо
Реакции: grin-du
А точно искомое содержимое есть в "instance.ActiveTab.DomText"? А то я на память не помню - внутри там точно Dom, а не текстовое представление страницы без тегов?
 
А точно искомое содержимое есть в "instance.ActiveTab.DomText"? А то я на память не помню - внутри там точно Dom, а не текстовое представление страницы без тегов?
у меня везде "instance.ActiveTab.DomText" такая конструкция используется. Вроде полноценный DOM получается.
 

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