Как зациклить удаление текста из строки? - PullRequest
1 голос
/ 25 июня 2019

Я хочу получить информацию о ценах с веб-сайта. Чтобы сделать это, я использую регулярное выражение, чтобы найти все случаи, где находится первый «$». Оттуда я использую подстроку, чтобы получить следующие 7 символов, которые будут, например, $ 42945. Я удаляю весь текст перед «$» и повторяю процесс несколько раз для разных значений суммы в $, расположенных на веб-сайте, который я использую через цикл For.

У меня проблема в том, что после того, как я обрезал строку, чтобы затем перейти к следующему $, исходная строка воссоздается.

Вот код, который я использую:

WebClient client = new WebClient();
string allcontent = client.DownloadString("example.com");

string body = allcontent.Substring(140480,200000);

Regex rx = new Regex("[$]");

var numberCount = rx.Matches(body).Count;

string price = String.Empty;
string price2 = String.Empty;
int match = Int32.MaxValue;
string trimmed = String.Empty;

List<string> priceList = new List<string>();

for (int i = 0; i < numberCount; i++)
{

    trimmed = body;

    match = rx.Match(trimmed).Index;

    price = trimmed.Substring(match, 7);

    priceList.Add(price);

    trimmed = trimmed.Remove(0, match + 7);

}

Console.WriteLine(priceList[0]);
Console.WriteLine(priceList[1]);

Console.ReadKey();

Предположим, строка: ABC $300 DEF $600 GHI $120 JKF $980

После первой итерации цикла я должен получить $300, на второй $600 и так далее. Вместо этого я получаю $300 каждый раз.

Как это исправить, чтобы получить правильные значения?

1 Ответ

3 голосов
/ 25 июня 2019

Существующий код начинает удаляться с начала строки, а не с места совпадения.Но мы можем упростить это, чтобы в большей степени полагаться на данные, предоставленные из соответствия RegEx:

var priceList = new List<string>();
var rx = new Regex("[$]([0-9]{1,2},)?[0-9]{3}");

using (var client = new WebClient())
{
    string body = client.DownloadString("example.com").Substring(140480,200000);
    var matches = rx.Matches(body);

    foreach (var match in matches)
    {
        priceList.Add(match);
    }   
}

Console.WriteLine(priceList[0]);
Console.WriteLine(priceList[1]);

Console.ReadKey(true);

Измененное выражение так, что оно будет соответствовать всему значению цены.Вы можете увидеть, как это работает здесь:

https://dotnetfiddle.net/1DltMh

Но даже этот код кажется хрупким.Использование регулярных выражений для анализа HTML обычно осуждается на .Любые небольшие изменения в формате веб-сайта, который вы просматриваете, могут серьезно сломать это.Вы могли бы гораздо лучше смотреть на настоящий HTML-парсер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...