【发布时间】:2019-06-25 18:45:12
【问题描述】:
我希望从网站上获取定价信息。为此,我使用正则表达式来查找第一个“$”所在的所有实例。从那里我使用子字符串来获取接下来的 7 个字符,例如42,945 美元。我删除了“$”之前的所有文本,并对位于我通过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。
如何解决这个问题以获得正确的值?
【问题讨论】:
-
在您的
for循环中,您在每个循环的顶部分配trimmed = body。另外,为什么不直接使用Regex.Matches并使用适当的正则表达式拉出价格? -
你可以简单地分割文本并解析字符串的每个开头,如this
-
foreach(Match match in Regex.Matches("ABC $300 DEF $600 GHI $120 JKF $980", @"\$\d+")) Console.WriteLine(match.Value);
标签: c# regex web-scraping