Существует Regex или другое решение.

Gooldbee

Client
Регистрация
16.05.2019
Сообщения
213
Благодарностей
24
Баллы
18
Здравствуйте, такая вот у меня случилась проблемка.
Делаю парсинг страницы
Получаю код в список.
Текст-тест213213
1
3
4
Текст тест213213
1
3
4
и т.д
использую c# для анализа списка
var znach = project.Lists["Список"].ToList();
for (int i = 0; i < znach.Count; i++)
{
if (znach.IndexOf("Текст") != -1)
{
var position = Convert.ToInt32(znach[i+1]);
var win = Convert.ToInt32(znach[i+2]);
var lose = Convert.ToInt32(znach[i+3]);
if(position != 0)
{
if((win+lose) >= 5)
{
int score = int.Parse(project.Variables["GAMESCORE"].Value);
if(position < 3) project.Variables["GAMESCORE"].Value = "1";
else project.Variables["GAMESCORE"].Value = "0";
break;
}
}
}
}
if(Convert.ToInt32(project.Variables["GAMESCORE"].Value) == 0)
return null;
else
return true;
Проблема в том что в парсинге попадается код где:
Текст-тест213515
Текст-тест213213
1
3
4
Текст тест213213
1
3
4
Код выполняется успешно, но отдаёт false. Даже если условия удовлетворяют.
Вопрос. Есть ли какое то регулярное выражение которое помоет исключать строку из парсинга если после неё нету цифр.
Или может можно как то код исправить - Большое спасибо за внимание.
 
Последнее редактирование:

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 804
Баллы
113
У Вас в 4-й строке ( if (znach.IndexOf("Текст") != -1) ) происходит проверка "есть ли во всём списке строка "Текст"". Скорее всего тут Вы хотите проверить есть ли в текущей взятой из списка строке какое-то значение и если строка содержит искомое значение, то обработать её, верно?

Попробуйте такой код:
C#:
var znach = project.Lists["Список"].ToList();
for (int i = 0; i < znach.Count; i++)
{
    int position = -1;
    // Проверяем, что текущая строка содержит "Текст" и следующая строка - число.
    if (znach[i].Contains("Текст") && Int32.TryParse(znach[i+1], out position))
    {
        var win = Convert.ToInt32(znach[i+2]);
        var lose = Convert.ToInt32(znach[i+3]);
        if(position != 0)
        {
            if((win+lose) >= 5)
            {
                int score = int.Parse(project.Variables["GAMESCORE"].Value);
                if(position < 3) project.Variables["GAMESCORE"].Value = "1";
                else project.Variables["GAMESCORE"].Value = "0";
                break;
            }
        }
    }
}
if(Convert.ToInt32(project.Variables["GAMESCORE"].Value) == 0)
    return null;
else
    return true;
P.S. Судя по коду, если Вы получили одно значение то экшен выходит по зелёной ветке, если другое - по красной. Я бы не рекомендовал так делать, т.к. если в коде произойдёт ошибка, то экшен выйдет по красной ветке и Вы будете думать, что не удалось найти значение в списке, а на самом деле, например, в переменной GAMESCORE пусто и по этому происходит выход по красной. Лучше всегда выходить по зелёной ветке, возвращать из сниппета какое-нибудь значение и уже на основе этого значения делать вывод успешная была обработка или нет.
 
  • Спасибо
Реакции: Gooldbee

Gooldbee

Client
Регистрация
16.05.2019
Сообщения
213
Благодарностей
24
Баллы
18
У Вас в 4-й строке ( if (znach.IndexOf("Текст") != -1) ) происходит проверка "есть ли во всём списке строка "Текст"". Скорее всего тут Вы хотите проверить есть ли в текущей взятой из списка строке какое-то значение и если строка содержит искомое значение, то обработать её, верно?

Попробуйте такой код:
C#:
var znach = project.Lists["Список"].ToList();
for (int i = 0; i < znach.Count; i++)
{
    int position = -1;
    // Проверяем, что текущая строка содержит "Текст" и следующая строка - число.
    if (znach[i].Contains("Текст") && Int32.TryParse(znach[i+1], out position))
    {
        var win = Convert.ToInt32(znach[i+2]);
        var lose = Convert.ToInt32(znach[i+3]);
        if(position != 0)
        {
            if((win+lose) >= 5)
            {
                int score = int.Parse(project.Variables["GAMESCORE"].Value);
                if(position < 3) project.Variables["GAMESCORE"].Value = "1";
                else project.Variables["GAMESCORE"].Value = "0";
                break;
            }
        }
    }
}
if(Convert.ToInt32(project.Variables["GAMESCORE"].Value) == 0)
    return null;
else
    return true;
P.S. Судя по коду, если Вы получили одно значение то экшен выходит по зелёной ветке, если другое - по красной. Я бы не рекомендовал так делать, т.к. если в коде произойдёт ошибка, то экшен выйдет по красной ветке и Вы будете думать, что не удалось найти значение в списке, а на самом деле, например, в переменной GAMESCORE пусто и по этому происходит выход по красной. Лучше всегда выходить по зелёной ветке, возвращать из сниппета какое-нибудь значение и уже на основе этого значения делать вывод успешная была обработка или нет.
Золотой вы человек! Спасибо большое всё сработало. на счёт тру и фэлс, согласен с вами так и поступлю. Хорошего вам года!
 
  • Спасибо
Реакции: nicanil

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